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:
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"mixins": [
|
||||
"PlayerListMixin",
|
||||
"ServerLoginPacketListenerImplMixin"
|
||||
"ServerLoginPacketListenerImplMixin",
|
||||
"ChunkMapAccessor",
|
||||
"TrackedEntityMixin"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
|
||||
Reference in New Issue
Block a user