Fix ServerPlayer cast crash (#419)

This commit is contained in:
IzzelAliz 2021-12-12 11:34:04 +08:00
parent dc4623addc
commit 74e69e5e3d
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
5 changed files with 46 additions and 20 deletions

View File

@ -0,0 +1,19 @@
package io.izzel.arclight.common.bridge.core.world;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.world.entity.Entity;
import java.util.Set;
public interface ServerEntityBridge {
void bridge$setTrackedPlayers(Set<ServerPlayerConnection> trackedPlayers);
Entity bridge$getTrackingEntity();
boolean bridge$syncPosition();
boolean bridge$instantSyncPosition();
boolean bridge$instantSyncMotion();
}

View File

@ -1,9 +0,0 @@
package io.izzel.arclight.common.bridge.core.world;
import java.util.Set;
import net.minecraft.server.level.ServerPlayer;
public interface TrackedEntityBridge {
void bridge$setTrackedPlayers(Set<ServerPlayer> trackedPlayers);
}

View File

@ -0,0 +1,8 @@
package io.izzel.arclight.common.bridge.core.world.server;
import net.minecraft.server.level.ServerEntity;
public interface ChunkMap_TrackedEntityBridge {
ServerEntity bridge$getServerEntity();
}

View File

@ -1,9 +1,10 @@
package io.izzel.arclight.common.mixin.core.server.level;
import io.izzel.arclight.common.bridge.core.world.TrackedEntityBridge;
import io.izzel.arclight.common.bridge.core.world.ServerEntityBridge;
import io.izzel.arclight.common.bridge.core.world.server.ChunkMap_TrackedEntityBridge;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerEntity;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.world.entity.Entity;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
@ -15,15 +16,20 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Set;
@Mixin(ChunkMap.TrackedEntity.class)
public abstract class ChunkMap_TrackedEntityMixin {
public abstract class ChunkMap_TrackedEntityMixin implements ChunkMap_TrackedEntityBridge {
// @formatter:off
@Shadow @Final ServerEntity serverEntity;
@Shadow @Final public Set<ServerPlayer> seenBy;
@Shadow @Final public Set<ServerPlayerConnection> seenBy;
// @formatter:on
@Inject(method = "<init>", at = @At("RETURN"))
private void arclight$setTrackedPlayers(ChunkMap outer, Entity entity, int range, int updateFrequency, boolean sendVelocityUpdates, CallbackInfo ci) {
((TrackedEntityBridge) this.serverEntity).bridge$setTrackedPlayers(this.seenBy);
((ServerEntityBridge) this.serverEntity).bridge$setTrackedPlayers(this.seenBy);
}
@Override
public ServerEntity bridge$getServerEntity() {
return this.serverEntity;
}
}

View File

@ -3,7 +3,7 @@ package io.izzel.arclight.common.mixin.core.server.level;
import com.google.common.collect.Lists;
import com.mojang.datafixers.util.Pair;
import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge;
import io.izzel.arclight.common.bridge.core.world.TrackedEntityBridge;
import io.izzel.arclight.common.bridge.core.world.ServerEntityBridge;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundAddMobPacket;
import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket;
@ -20,6 +20,7 @@ import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerEntity;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.util.Mth;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.Entity;
@ -54,7 +55,7 @@ import java.util.Set;
import java.util.function.Consumer;
@Mixin(ServerEntity.class)
public abstract class ServerEntityMixin implements TrackedEntityBridge {
public abstract class ServerEntityMixin implements ServerEntityBridge {
// @formatter:off
@Shadow @Final private Entity entity;
@ -79,7 +80,7 @@ public abstract class ServerEntityMixin implements TrackedEntityBridge {
@Shadow protected abstract void broadcastAndSend(Packet<?> packet);
// @formatter:on
private Set<ServerPlayer> trackedPlayers;
private Set<ServerPlayerConnection> trackedPlayers;
@Inject(method = "<init>", at = @At("RETURN"))
private void arclight$init(ServerLevel serverWorld, Entity entity, int updateFrequency, boolean sendVelocityUpdates, Consumer<Packet<?>> packetConsumer, CallbackInfo ci) {
@ -90,13 +91,13 @@ public abstract class ServerEntityMixin implements TrackedEntityBridge {
throw new NullPointerException();
}
public void arclight$constructor(ServerLevel serverWorld, Entity entity, int updateFrequency, boolean sendVelocityUpdates, Consumer<Packet<?>> packetConsumer, Set<ServerPlayer> set) {
public void arclight$constructor(ServerLevel serverWorld, Entity entity, int updateFrequency, boolean sendVelocityUpdates, Consumer<Packet<?>> packetConsumer, Set<ServerPlayerConnection> set) {
arclight$constructor(serverWorld, entity, updateFrequency, sendVelocityUpdates, packetConsumer);
this.trackedPlayers = set;
}
@Override
public void bridge$setTrackedPlayers(Set<ServerPlayer> trackedPlayers) {
public void bridge$setTrackedPlayers(Set<ServerPlayerConnection> trackedPlayers) {
this.trackedPlayers = trackedPlayers;
}
@ -116,7 +117,8 @@ public abstract class ServerEntityMixin implements TrackedEntityBridge {
if (this.tickCount % 10 == 0 && itemstack.getItem() instanceof MapItem) {
MapItemSavedData mapdata = MapItem.getSavedData(itemstack, this.level);
if (mapdata != null) {
for (ServerPlayer serverplayerentity : this.trackedPlayers) {
for (ServerPlayerConnection connection : this.trackedPlayers) {
var serverplayerentity = connection.getPlayer();
mapdata.tickCarriedBy(serverplayerentity, itemstack);
Packet<?> ipacket = ((MapItem) itemstack.getItem()).getUpdatePacket(itemstack, this.level, serverplayerentity);
if (ipacket != null) {