Skip to content

Commit

Permalink
Fix getModifiedMetadataFor on 1.19.3 (#2417)
Browse files Browse the repository at this point in the history
* Initial Fix

* Initialize list to packet's list size

* Naming fixes

* Cleanup debug output

* Cleanup imports

* Re-add try/catch

* Comment the meaning of dataValue IDs
  • Loading branch information
tal5 committed Dec 23, 2022
1 parent 7bc1dab commit 63a1a5e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@

public class PacketHelperImpl implements PacketHelper {

public static final EntityDataAccessor<Float> ENTITY_HUMAN_DATA_WATCHER_ABSORPTION = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, ReflectionMappingsInfo.Player_DATA_PLAYER_ABSORPTION_ID, null);
public static final EntityDataAccessor<Float> PLAYER_DATA_ACCESSOR_ABSORPTION = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, ReflectionMappingsInfo.Player_DATA_PLAYER_ABSORPTION_ID, null);

public static final EntityDataAccessor<Byte> ENTITY_DATA_WATCHER_FLAGS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_SHARED_FLAGS_ID, null);
public static final EntityDataAccessor<Byte> ENTITY_DATA_ACCESSOR_FLAGS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_SHARED_FLAGS_ID, null);

public static final MethodHandle ABILITIES_PACKET_FOV_SETTER = ReflectionHelper.getFinalSetter(ClientboundPlayerAbilitiesPacket.class, ReflectionMappingsInfo.ClientboundPlayerAbilitiesPacket_walkingSpeed);

Expand All @@ -88,13 +88,13 @@ public class PacketHelperImpl implements PacketHelper {

public static MethodHandle BLOCK_ENTITY_DATA_PACKET_CONSTRUCTOR = ReflectionHelper.getConstructor(ClientboundBlockEntityDataPacket.class, BlockPos.class, BlockEntityType.class, net.minecraft.nbt.CompoundTag.class);

public static EntityDataAccessor<Optional<Component>> ENTITY_CUSTOM_NAME_METADATA = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_CUSTOM_NAME, null);
public static EntityDataAccessor<Boolean> ENTITY_CUSTOM_NAME_VISIBLE_METADATA = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_CUSTOM_NAME_VISIBLE, null);
public static EntityDataAccessor<Optional<Component>> ENTITY_DATA_ACCESSOR_CUSTOM_NAME = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_CUSTOM_NAME, null);
public static EntityDataAccessor<Boolean> ENTITY_DATA_ACCESSOR_CUSTOM_NAME_VISIBLE = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_CUSTOM_NAME_VISIBLE, null);

@Override
public void setFakeAbsorption(Player player, float value) {
SynchedEntityData dw = new SynchedEntityData(null);
dw.define(ENTITY_HUMAN_DATA_WATCHER_ABSORPTION, value);
dw.define(PLAYER_DATA_ACCESSOR_ABSORPTION, value);
send(player, new ClientboundSetEntityDataPacket(player.getEntityId(), dw.packDirty()));
}

Expand Down Expand Up @@ -297,8 +297,8 @@ public void sendRename(Player player, Entity entity, String name, boolean listMo
}
SynchedEntityData fakeData = new SynchedEntityData(((CraftEntity) entity).getHandle());
List<SynchedEntityData.DataValue<?>> list = new ArrayList<>();
list.add(new SynchedEntityData.DataValue<>(ENTITY_CUSTOM_NAME_METADATA.getId(), ENTITY_CUSTOM_NAME_METADATA.getSerializer(), Optional.of(Handler.componentToNMS(FormattedTextHelper.parse(name, ChatColor.WHITE)))));
list.add(new SynchedEntityData.DataValue<>(ENTITY_CUSTOM_NAME_VISIBLE_METADATA.getId(), ENTITY_CUSTOM_NAME_VISIBLE_METADATA.getSerializer(), true));
list.add(new SynchedEntityData.DataValue<>(ENTITY_DATA_ACCESSOR_CUSTOM_NAME.getId(), ENTITY_DATA_ACCESSOR_CUSTOM_NAME.getSerializer(), Optional.of(Handler.componentToNMS(FormattedTextHelper.parse(name, ChatColor.WHITE)))));
list.add(new SynchedEntityData.DataValue<>(ENTITY_DATA_ACCESSOR_CUSTOM_NAME_VISIBLE.getId(), ENTITY_DATA_ACCESSOR_CUSTOM_NAME_VISIBLE.getSerializer(), true));
send(player, new ClientboundSetEntityDataPacket(entity.getEntityId(), list));
}
catch (Throwable ex) {
Expand Down Expand Up @@ -341,8 +341,8 @@ public void removeNoCollideTeam(Player player, UUID noCollide) {
@Override
public void sendEntityMetadataFlagsUpdate(Player player, Entity entity) {
List<SynchedEntityData.DataValue<?>> data = new ArrayList<>();
byte flags = ((CraftEntity) entity).getHandle().getEntityData().get(ENTITY_DATA_WATCHER_FLAGS);
data.add(SynchedEntityData.DataValue.create(ENTITY_DATA_WATCHER_FLAGS, flags));
byte flags = ((CraftEntity) entity).getHandle().getEntityData().get(ENTITY_DATA_ACCESSOR_FLAGS);
data.add(SynchedEntityData.DataValue.create(ENTITY_DATA_ACCESSOR_FLAGS, flags));
send(player, new ClientboundSetEntityDataPacket(entity.getEntityId(), data));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package com.denizenscript.denizen.nms.v1_19.impl.network.handlers;

import com.denizenscript.denizen.events.player.*;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.abstracts.BlockLight;
import com.denizenscript.denizen.nms.v1_19.Handler;
import com.denizenscript.denizen.nms.v1_19.ReflectionMappingsInfo;
import com.denizenscript.denizen.nms.v1_19.helpers.PacketHelperImpl;
import com.denizenscript.denizen.nms.v1_19.impl.ProfileEditorImpl;
import com.denizenscript.denizen.nms.v1_19.impl.network.packets.*;
import com.denizenscript.denizen.nms.v1_19.impl.blocks.BlockLightImpl;
import com.denizenscript.denizen.nms.v1_19.impl.entities.EntityFakePlayerImpl;
import com.denizenscript.denizen.nms.v1_19.impl.network.packets.PacketOutChatImpl;
import com.denizenscript.denizen.nms.v1_19.impl.network.packets.PacketOutEntityMetadataImpl;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.scripts.commands.entity.FakeEquipCommand;
Expand All @@ -28,15 +31,14 @@
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.utilities.CoreConfiguration;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.ReflectionHelper;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import com.google.common.base.Joiner;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import com.mojang.datafixers.util.Pair;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizencore.utilities.ReflectionHelper;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.md_5.bungee.api.ChatColor;
import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList;
Expand Down Expand Up @@ -773,58 +775,52 @@ public ClientboundSetEntityDataPacket getModifiedMetadataFor(ClientboundSetEntit
return null;
}
try {
int eid = metadataPacket.id();
Entity ent = player.level.getEntity(eid);
if (ent == null) {
Entity entity = player.level.getEntity(metadataPacket.id());
if (entity == null) {
return null; // If it doesn't exist on-server, it's definitely not relevant, so move on
}
String nameToApply = RenameCommand.getCustomNameFor(ent.getUUID(), player.getBukkitEntity(), false);
Boolean forceSneak = SneakCommand.shouldSneak(ent.getUUID(), player.getUUID());
Boolean isInvisible = InvisibleCommand.isInvisible(ent.getBukkitEntity(), player.getUUID(), true);
if (nameToApply == null && forceSneak == null && isInvisible == null) {
String nameToApply = RenameCommand.getCustomNameFor(entity.getUUID(), player.getBukkitEntity(), false);
Boolean forceSneak = SneakCommand.shouldSneak(entity.getUUID(), player.getUUID());
Boolean isInvisible = InvisibleCommand.isInvisible(entity.getBukkitEntity(), player.getUUID(), true);
boolean shouldModifyFlags = isInvisible != null || forceSneak != null;
if (nameToApply == null && !shouldModifyFlags) {
return null;
}
List<SynchedEntityData.DataValue<?>> data = new ArrayList<>(metadataPacket.packedItems());
boolean any = false;
for (int i = 0; i < data.size(); i++) {
SynchedEntityData.DataValue<?> item = data.get(i);
EntityDataSerializer<?> watcherObject = item.serializer();
if (item.id() == 0 && (forceSneak != null || isInvisible != null)) { // 0: Entity flags
byte val = (Byte) item.value();
if (forceSneak != null) {
if (forceSneak) {
val |= 0x02; // 8: Crouching
}
else {
val &= ~0x02;
}
List<SynchedEntityData.DataValue<?>> data = new ArrayList<>(metadataPacket.packedItems().size());
Byte currentFlags = null;
for (SynchedEntityData.DataValue<?> dataValue : metadataPacket.packedItems()) {
if (dataValue.id() == 0 && shouldModifyFlags) { // 0: Entity Flags
currentFlags = (Byte) dataValue.value();
}
else if (nameToApply == null || (dataValue.id() != 2 && dataValue.id() != 3)) { // 2 and 3: Custom name and custom name visible
data.add(dataValue);
}
}
if (shouldModifyFlags) {
byte flags = currentFlags == null ? entity.getEntityData().get(PacketHelperImpl.ENTITY_DATA_ACCESSOR_FLAGS) : currentFlags;
if (forceSneak != null) {
if (forceSneak) {
flags |= 0x02;
}
if (isInvisible != null) {
if (isInvisible) {
val |= 0x20;
}
else {
val &= ~0x20;
}
else {
flags &= ~0x02;
}
data.set(i, new SynchedEntityData.DataValue(item.id(), watcherObject, val));
any = true;
}
else if (item.id() == 2 && nameToApply != null) { // 2: Custom name metadata
Optional<Component> name = Optional.of(Handler.componentToNMS(FormattedTextHelper.parse(nameToApply, ChatColor.WHITE)));
data.set(i, new SynchedEntityData.DataValue(item.id(), watcherObject, name));
any = true;
}
else if (item.id() == 3 && nameToApply != null) { // 3: custom name visible metadata
data.set(i, new SynchedEntityData.DataValue(item.id(), watcherObject, true));
any = true;
if (isInvisible != null) {
if (isInvisible) {
flags |= 0x20;
}
else {
flags &= ~0x20;
}
}
data.add(SynchedEntityData.DataValue.create(PacketHelperImpl.ENTITY_DATA_ACCESSOR_FLAGS, flags));
}
if (!any) {
return null;
if (nameToApply != null) {
data.add(SynchedEntityData.DataValue.create(PacketHelperImpl.ENTITY_DATA_ACCESSOR_CUSTOM_NAME, Optional.of(Handler.componentToNMS(FormattedTextHelper.parse(nameToApply, ChatColor.WHITE)))));
data.add(SynchedEntityData.DataValue.create(PacketHelperImpl.ENTITY_DATA_ACCESSOR_CUSTOM_NAME_VISIBLE, true));
}
ClientboundSetEntityDataPacket altPacket = new ClientboundSetEntityDataPacket(metadataPacket.id(), data);
return altPacket;
return new ClientboundSetEntityDataPacket(metadataPacket.id(), data);
}
catch (Throwable ex) {
Debug.echoError(ex);
Expand Down

0 comments on commit 63a1a5e

Please sign in to comment.