1
0
mirror of https://github.com/Suiranoil/SkinRestorer.git synced 2026-01-16 04:42:12 +00:00

smoother player refreshing

This commit is contained in:
2024-06-29 20:42:42 +03:00
parent 9733490dd0
commit 799ec9d52e
4 changed files with 57 additions and 5 deletions

View File

@@ -0,0 +1,13 @@
package net.lionarius.skinrestorer.mixin;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.server.level.ChunkMap;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(ChunkMap.class)
public interface ChunkMapAccessor {
@Accessor
Int2ObjectMap<Object> getEntityMap();
}

View File

@@ -0,0 +1,22 @@
package net.lionarius.skinrestorer.mixin;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;
import java.util.Set;
@Mixin(targets = "net.minecraft.server.level.ChunkMap$TrackedEntity")
public interface TrackedEntityMixin {
@Accessor
Set<ServerPlayerConnection> getSeenBy();
@Invoker
void invokeRemovePlayer(ServerPlayer player);
@Invoker
void invokeUpdatePlayer(ServerPlayer player);
}

View File

@@ -3,8 +3,10 @@ package net.lionarius.skinrestorer.util;
import com.google.gson.JsonObject;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.lionarius.skinrestorer.mixin.ChunkMapAccessor;
import net.lionarius.skinrestorer.mixin.TrackedEntityMixin;
import net.minecraft.network.protocol.game.*;
import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.PlayerList;
@@ -25,7 +27,7 @@ public final class PlayerUtils {
public static void refreshPlayer(ServerPlayer player) {
ServerLevel serverLevel = player.serverLevel();
PlayerList playerList = serverLevel.getServer().getPlayerList();
ServerChunkCache chunkSource = serverLevel.getChunkSource();
ChunkMap chunkMap = serverLevel.getChunkSource().chunkMap;
playerList.broadcastAll(new ClientboundBundlePacket(
List.of(
@@ -34,9 +36,22 @@ public final class PlayerUtils {
)
));
var trackedEntity = (TrackedEntityMixin) ((ChunkMapAccessor) chunkMap).getEntityMap().get(player.getId());
if (trackedEntity != null) {
for (var observerConnection : trackedEntity.getSeenBy()) {
var observer = observerConnection.getPlayer();
trackedEntity.invokeRemovePlayer(observer);
var trackedObserverEntity = (TrackedEntityMixin) ((ChunkMapAccessor) chunkMap).getEntityMap().get(observer.getId());
if (trackedObserverEntity != null) {
trackedObserverEntity.invokeRemovePlayer(player);
trackedObserverEntity.invokeUpdatePlayer(player);
}
trackedEntity.invokeUpdatePlayer(observer);
}
}
if (!player.isDeadOrDying()) {
chunkSource.removeEntity(player);
chunkSource.addEntity(player);
player.connection.send(new ClientboundBundlePacket(
List.of(
new ClientboundRespawnPacket(player.createCommonSpawnInfo(serverLevel), ClientboundRespawnPacket.KEEP_ALL_DATA),

View File

@@ -5,7 +5,9 @@
"compatibilityLevel": "JAVA_8",
"mixins": [
"PlayerListMixin",
"ServerLoginPacketListenerImplMixin"
"ServerLoginPacketListenerImplMixin",
"ChunkMapAccessor",
"TrackedEntityMixin"
],
"injectors": {
"defaultRequire": 1