Skip to content

Commit

Permalink
Update to 1.20.4
Browse files Browse the repository at this point in the history
Patbox committed Jan 6, 2024
1 parent 09677ca commit 90bf223
Showing 10 changed files with 139 additions and 166 deletions.
10 changes: 5 additions & 5 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx2G
# Fabric Properties
minecraft_version=1.20.1
yarn_mappings=1.20.1+build.1
loader_version=0.14.18
minecraft_version=1.20.4
yarn_mappings=1.20.4+build.1
loader_version=0.15.3
#Fabric api
fabric_version=0.88.1+1.20.1
fabric_version=0.91.1+1.20.4
# Mod Properties
mod_version=1.3.4
mod_version=1.3.5
maven_group=xyz.nucleoid
archives_base_name = disguiselib
Original file line number Diff line number Diff line change
@@ -79,7 +79,7 @@ private static int disguiseAsPlayer(CommandContext<ServerCommandSource> ctx) thr
}

profile = new GameProfile(null, playername); //fixme profile doesn't contain skin data; migrate to fabrictailor
SkullBlockEntity.loadProperties(profile, gameProfile -> {
/*SkullBlockEntity.loadProperties(profile, gameProfile -> {
// Minecraft doesn't allow "summoning" players, that's why we make an exception
GameProfile finalProfile = gameProfile == null ? player.getGameProfile() : gameProfile;
entities.forEach(entity -> {
@@ -103,7 +103,7 @@ private static int disguiseAsPlayer(CommandContext<ServerCommandSource> ctx) thr
src.sendError(NO_PERMISSION_ERROR);
}
});
});
});*/
return 0;
}

Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.packet.c2s.common.SyncedClientOptions;
import net.minecraft.network.packet.s2c.play.*;
import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryKey;
@@ -329,7 +330,7 @@ public void setGameProfile(@Nullable GameProfile gameProfile) {
*/
@Unique
private void disguiselib$constructFakePlayer(@NotNull GameProfile profile) {
this.disguiselib$disguiseEntity = new ServerPlayerEntity(world.getServer(), (ServerWorld) world, profile);
this.disguiselib$disguiseEntity = new ServerPlayerEntity(world.getServer(), (ServerWorld) world, profile, SyncedClientOptions.createDefault());
this.disguiselib$disguiseEntity.getDataTracker().set(getPLAYER_MODEL_PARTS(), (byte) 0x7f);
}

@@ -372,18 +373,7 @@ public void setGameProfile(@Nullable GameProfile gameProfile) {
if (this.disguiselib$entity instanceof ServerPlayerEntity player) {
ServerWorld targetWorld = (ServerWorld) player.getWorld();

player.networkHandler.sendPacket(new PlayerRespawnS2CPacket(
targetWorld.getDimensionKey(), // getDimension()
targetWorld.getRegistryKey(),
BiomeAccess.hashSeed(targetWorld.getSeed()),
player.interactionManager.getGameMode(),
player.interactionManager.getPreviousGameMode(),
targetWorld.isDebugWorld(),
targetWorld.isFlat(),
(byte) 3,
Optional.empty(),
player.getPortalCooldown()
));
player.networkHandler.sendPacket(new PlayerRespawnS2CPacket(player.createCommonPlayerSpawnInfo(targetWorld), PlayerRespawnS2CPacket.KEEP_ALL));
player.networkHandler.requestTeleport(player.getX(), player.getY(), player.getZ(), player.getYaw(), player.getPitch());

player.server.getPlayerManager().sendCommandTree(player);
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package xyz.nucleoid.disguiselib.impl.mixin;

import com.mojang.authlib.GameProfile;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketCallbacks;
import net.minecraft.network.listener.ClientPlayPacketListener;
import net.minecraft.network.packet.BrandCustomPayload;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.network.packet.s2c.play.*;
import net.minecraft.server.network.ServerCommonNetworkHandler;
import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import xyz.nucleoid.disguiselib.api.DisguiseUtils;
import xyz.nucleoid.disguiselib.api.EntityDisguise;
import xyz.nucleoid.disguiselib.impl.mixin.accessor.*;
import xyz.nucleoid.disguiselib.impl.packets.ExtendedHandler;
import xyz.nucleoid.disguiselib.impl.packets.FakePackets;

import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

import static xyz.nucleoid.disguiselib.impl.DisguiseLib.DISGUISE_TEAM;

@Mixin(ServerCommonNetworkHandler.class)
public abstract class ServerCommonNetworkHandlerMixin_Disguiser {
@Shadow
public abstract void sendPacket(Packet<?> packet);

@Unique
private boolean disguiselib$skipCheck;

/**
* Checks the packet that was sent. If the entity in the packet is disguised, the
* entity type / id in the packet will be changed.
*
* As minecraft client doesn't allow moving if you send it an entity with the same
* id as player, we send the disguised player another entity, so they will see their
* own disguise.
*
* @param packet packet being sent
*/
@Inject(
method = "send",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/network/ClientConnection;send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;Z)V"
),
cancellable = true
)
private void disguiseEntity(Packet<ClientPlayPacketListener> packet, PacketCallbacks callbacks, CallbackInfo ci) {
if (!this.disguiselib$skipCheck) {
if (!(this instanceof ExtendedHandler self)) {
return;
}
if (packet instanceof BundleS2CPacket bundleS2CPacket) {
if (bundleS2CPacket.getPackets() instanceof ArrayList<Packet<ClientPlayPacketListener>> list) {
var list2 = new ArrayList<Packet<ClientPlayPacketListener>>();
var adder = new ArrayList<Packet<ClientPlayPacketListener>>();
var atomic = new AtomicBoolean(true);
for (var packet2 : list) {
atomic.set(true);
adder.clear();
self.disguiselib$transformPacket(packet2, () -> atomic.set(false), list2::add);

if (atomic.get()) {
list2.add(packet2);
}

list2.addAll(adder);
}

list.clear();
list.addAll(list2);
}
} else {
this.disguiselib$skipCheck = true;
self.disguiselib$transformPacket(packet, ci::cancel, this::sendPacket);
this.disguiselib$skipCheck = false;
}
}
}

@Inject(method = "onCustomPayload", at = @At("TAIL"))
private void onClientBrand(CustomPayloadC2SPacket packet, CallbackInfo ci) {
if (packet.payload() instanceof BrandCustomPayload && this instanceof ExtendedHandler self) {
self.disguiselib$onClientBrand();
}
}
}
Original file line number Diff line number Diff line change
@@ -5,12 +5,14 @@
import net.minecraft.entity.EntityType;
import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.ClientConnection;
import net.minecraft.network.listener.ClientPlayPacketListener;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.PacketCallbacks;
import net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.network.packet.s2c.play.*;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ConnectedClientData;
import net.minecraft.server.network.ServerCommonNetworkHandler;
import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.world.World;
@@ -23,83 +25,33 @@
import xyz.nucleoid.disguiselib.api.DisguiseUtils;
import xyz.nucleoid.disguiselib.api.EntityDisguise;
import xyz.nucleoid.disguiselib.impl.mixin.accessor.*;
import xyz.nucleoid.disguiselib.impl.packets.ExtendedHandler;
import xyz.nucleoid.disguiselib.impl.packets.FakePackets;

import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

import static net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket.BRAND;
import static xyz.nucleoid.disguiselib.impl.DisguiseLib.DISGUISE_TEAM;

@Mixin(ServerPlayNetworkHandler.class)
public abstract class ServerPlayNetworkHandlerMixin_Disguiser {
public abstract class ServerPlayNetworkHandlerMixin_Disguiser extends ServerCommonNetworkHandler implements ExtendedHandler {
@Shadow public ServerPlayerEntity player;

@Shadow public abstract void sendPacket(Packet<?> packet);

@Unique
private boolean disguiselib$skipCheck;
@Unique
private final Set<Packet<?>> disguiselib$q = new HashSet<>();
@Unique
private int disguiselib$qTimer;
@Unique
private boolean disguiselib$sentTeamPacket;

/**
* Checks the packet that was sent. If the entity in the packet is disguised, the
* entity type / id in the packet will be changed.
*
* As minecraft client doesn't allow moving if you send it an entity with the same
* id as player, we send the disguised player another entity, so they will see their
* own disguise.
*
* @param packet packet being sent
*/
@Inject(
method = "sendPacket(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/network/ClientConnection;send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V"
),
cancellable = true
)
private void disguiseEntity(Packet<ClientPlayPacketListener> packet, PacketCallbacks callbacks, CallbackInfo ci) {
if (!this.disguiselib$skipCheck) {
if (packet instanceof BundleS2CPacket bundleS2CPacket) {
if (bundleS2CPacket.getPackets() instanceof ArrayList<Packet<ClientPlayPacketListener>> list) {
var list2 = new ArrayList<Packet<ClientPlayPacketListener>>();
var adder = new ArrayList<Packet<ClientPlayPacketListener>>();
var atomic = new AtomicBoolean(true);
for (var packet2 : list) {
atomic.set(true);
adder.clear();
this.disguiselib$transformPacket(packet2, () -> atomic.set(false), list2::add);

if (atomic.get()) {
list2.add(packet2);
}

list2.addAll(adder);
}

list.clear();
list.addAll(list2);
}
} else {
this.disguiselib$transformPacket(packet, ci::cancel, this::sendPacket);
}
}
public ServerPlayNetworkHandlerMixin_Disguiser(MinecraftServer server, ClientConnection connection, ConnectedClientData clientData) {
super(server, connection, clientData);
}

@Unique
private void disguiselib$transformPacket(Packet<ClientPlayPacketListener> packet, Runnable remove, Consumer<Packet<ClientPlayPacketListener>> add) {
public void disguiselib$transformPacket(Packet<ClientPlayPacketListener> packet, Runnable remove, Consumer<Packet<ClientPlayPacketListener>> add) {
World world = this.player.getEntityWorld();
Entity entity = null;
if (packet instanceof PlayerSpawnS2CPacket) {
entity = world.getEntityById(((PlayerSpawnS2CPacketAccessor) packet).getId());
} else if (packet instanceof EntitySpawnS2CPacket) {
if (packet instanceof EntitySpawnS2CPacket) {
entity = world.getEntityById(((EntitySpawnS2CPacketAccessor) packet).getEntityId());
} else if (packet instanceof EntitiesDestroyS2CPacket && !((EntitiesDestroyS2CPacketAccessor) packet).getEntityIds().isEmpty() && ((EntitiesDestroyS2CPacketAccessor) packet).getEntityIds().getInt(0) == this.player.getId()) {
remove.run();
@@ -180,7 +132,6 @@ private void disguiseEntity(Packet<ClientPlayPacketListener> packet, PacketCallb
else
spawnPacket = FakePackets.universalSpawnPacket(entity);

this.disguiselib$skipCheck = true;
if (disguise.getDisguiseType() == EntityType.PLAYER) {
PlayerListS2CPacket packet = new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, (ServerPlayerEntity) disguiseEntity);
add.accept(packet);
@@ -217,9 +168,6 @@ private void disguiseEntity(Packet<ClientPlayPacketListener> packet, PacketCallb
add.accept((Packet<ClientPlayPacketListener>) spawnPacket);
remove.run();
}


this.disguiselib$skipCheck = false;
}


@@ -252,18 +200,12 @@ private void removeFromTablist(PlayerMoveC2SPacket packet, CallbackInfo ci) {
if(!this.disguiselib$q.isEmpty() && --this.disguiselib$qTimer <= 0) {
// fixme - non-living disguised as player still not showing up
// fixme - player sometimes gets removed from tablist :(
this.disguiselib$skipCheck = true;
this.disguiselib$q.forEach(this::sendPacket);
this.disguiselib$q.clear();
this.disguiselib$skipCheck = false;
}
this.disguiselib$q.clear();}
}



@Inject(method = "onCustomPayload(Lnet/minecraft/network/packet/c2s/play/CustomPayloadC2SPacket;)V", at = @At("TAIL"))
private void onClientBrand(CustomPayloadC2SPacket packet, CallbackInfo ci) {
if (!this.disguiselib$sentTeamPacket && packet.getChannel().equals(BRAND)) {
public void disguiselib$onClientBrand() {
if (!this.disguiselib$sentTeamPacket) {
// Disabling collisions with the disguised entity itself
TeamS2CPacket addTeamPacket = TeamS2CPacket.updateTeam(DISGUISE_TEAM, true); // create team
this.disguiselib$sentTeamPacket = true;
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package xyz.nucleoid.disguiselib.impl.mixin.accessor;

import net.minecraft.server.network.EntityTrackerEntry;
import net.minecraft.server.world.EntityTrackingListener;
import net.minecraft.server.network.PlayerAssociatedNetworkHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@@ -12,5 +12,5 @@ public interface EntityTrackerEntryAccessor {
@Accessor("entry")
EntityTrackerEntry getEntry();
@Accessor("listeners")
Set<EntityTrackingListener> getListeners();
Set<PlayerAssociatedNetworkHandler> getListeners();
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package xyz.nucleoid.disguiselib.impl.packets;

import net.minecraft.network.listener.ClientPlayPacketListener;
import net.minecraft.network.packet.Packet;

import java.util.function.Consumer;

public interface ExtendedHandler {
void disguiselib$transformPacket(Packet<ClientPlayPacketListener> packet, Runnable remove, Consumer<Packet<ClientPlayPacketListener>> add);
void disguiselib$onClientBrand();
}
Original file line number Diff line number Diff line change
@@ -7,12 +7,10 @@
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
import net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import xyz.nucleoid.disguiselib.api.EntityDisguise;
import xyz.nucleoid.disguiselib.impl.mixin.accessor.EntitySpawnS2CPacketAccessor;
import xyz.nucleoid.disguiselib.impl.mixin.accessor.PlayerSpawnS2CPacketAccessor;

public class FakePackets {
/**
@@ -34,8 +32,6 @@ public static Packet<?> universalSpawnPacket(Entity entity) {

if(packet instanceof EntitySpawnS2CPacket) {
packet = fakeMobSpawnS2CPacket(entity);
} else if(packet instanceof PlayerSpawnS2CPacket) {
packet = fakePlayerSpawnS2CPacket(entity);
}

return packet;
@@ -103,37 +99,4 @@ public static EntitySpawnS2CPacket fakeEntitySpawnS2CPacket(Entity entity) {

return packet;
}

/**
* Constructs a fake {@link PlayerSpawnS2CPacket} for the given entity.
* Make sure you send the {@link net.minecraft.network.packet.s2c.play.PlayerListS2CPacket} as well
* if you're using this for yourself!
*
* @param entity entity that requires fake packet
*
* @return fake {@link PlayerSpawnS2CPacket}
*/
public static PlayerSpawnS2CPacket fakePlayerSpawnS2CPacket(Entity entity) {
Entity disguise = ((EntityDisguise) entity).getDisguiseEntity();
PlayerSpawnS2CPacket packet;

if (disguise instanceof PlayerEntity playerDisguise) // Needed in case of taterzens - when they're disguised "back" to players, the check will be false
packet = new PlayerSpawnS2CPacket(playerDisguise);
else
packet = new PlayerSpawnS2CPacket(entity.getServer().getPlayerManager().getPlayerList().get(0));

PlayerSpawnS2CPacketAccessor accessor = (PlayerSpawnS2CPacketAccessor) packet;

accessor.setId(entity.getId());
accessor.setUuid(entity.getUuid());

accessor.setX(entity.getX());
accessor.setY(entity.getY());
accessor.setZ(entity.getZ());

accessor.setYaw((byte) ((int) (entity.getYaw() * 256.0F / 360.0F)));
accessor.setPitch((byte) ((int) (entity.getPitch() * 256.0F / 360.0F)));

return packet;
}
}
2 changes: 1 addition & 1 deletion src/main/resources/disguiselib.mixins.json
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@
"compatibilityLevel": "JAVA_16",
"mixins": [
"EntityMixin_Disguise",
"ServerCommonNetworkHandlerMixin_Disguiser",
"ServerPlayNetworkHandlerMixin_Disguiser",
"ServerPlayNetworkHandlerMixin_HitCheck",
"accessor.EntitiesDestroyS2CPacketAccessor",
@@ -17,7 +18,6 @@
"accessor.EntityTrackerUpdateS2CPacketAccessor",
"accessor.PlayerEntityAccessor",
"accessor.PlayerListS2CPacketAccessor",
"accessor.PlayerSpawnS2CPacketAccessor",
"accessor.ThreadedAnvilChunkStorageAccessor"
],
"injectors": {

0 comments on commit 90bf223

Please sign in to comment.