fix effects meta not working on versions 1.8-1.10 because of duplicate data indexes due to incorrect implementation of the "using_item" property on those versions

This commit is contained in:
Pyrbu 2023-06-26 22:31:22 +02:00
parent 06c5397bd8
commit 46d848b823
9 changed files with 45 additions and 12 deletions

@ -19,7 +19,7 @@ import net.kyori.adventure.text.Component;
*/
public interface MetadataFactory {
EntityData skinLayers(boolean cape, boolean jacket, boolean leftSleeve, boolean rightSleeve, boolean leftLeg, boolean rightLeg, boolean hat);
EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra);
EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra, boolean usingItemLegacy);
EntityData silent(boolean enabled);
EntityData name(Component name);
EntityData nameShown();

@ -4,6 +4,11 @@ import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
public class V1_11MetadataFactory extends V1_10MetadataFactory {
@Override
public EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra, boolean usingItemLegacy) {
return super.effects(onFire, glowing, invisible, usingElytra, false);
}
@Override
public EntityData usingItem(boolean usingItem, boolean offHand, boolean riptide) {
return newEntityData(6, EntityDataTypes.BYTE, (byte) ((usingItem ? 0x01 : 0) | (offHand ? 0x02 : 0)));

@ -10,7 +10,7 @@ public class V1_17MetadataFactory extends V1_16MetadataFactory {
}
@Override
public EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra) {
public EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra, boolean usingItemLegacy) {
return newEntityData(0, EntityDataTypes.BYTE, (byte) ((onFire ? 0x01 : 0) | (invisible ? 0x20 : 0) | (glowing ? 0x40 : 0) | (usingElytra ? 0x80 : 0)));
}

@ -14,8 +14,8 @@ public class V1_8MetadataFactory implements MetadataFactory {
}
@Override
public EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra) {
return newEntityData(0, EntityDataTypes.BYTE, (byte) ((onFire ? 0x01 : 0) | (invisible ? 0x20 : 0)));
public EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra, boolean usingItemLegacy) {
return newEntityData(0, EntityDataTypes.BYTE, (byte) ((onFire ? 0x01 : 0) | (usingItemLegacy ? 0x10 : 0) | (invisible ? 0x20 : 0)));
}
@Override
@ -45,7 +45,7 @@ public class V1_8MetadataFactory implements MetadataFactory {
@Override
public EntityData usingItem(boolean enabled, boolean offHand, boolean riptide) {
return newEntityData(0, EntityDataTypes.BYTE, (byte) (enabled ? 0x10 : 0));
throw new UnsupportedOperationException("The standalone using item data isn't supported on this version");
}
@Override

@ -12,8 +12,8 @@ public class V1_9MetadataFactory extends V1_8MetadataFactory {
}
@Override
public EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra) {
return newEntityData(0, EntityDataTypes.BYTE, (byte) ((onFire ? 0x01 : 0) | (invisible ? 0x20 : 0) | (glowing ? 0x40 : 0) | (usingElytra ? 0x80 : 0)));
public EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra, boolean usingItemLegacy) {
return newEntityData(0, EntityDataTypes.BYTE, (byte) ((onFire ? 0x01 : 0) | (usingItemLegacy ? 0x10 : 0) | (invisible ? 0x20 : 0) | (glowing ? 0x40 : 0) | (usingElytra ? 0x80 : 0)));
}
@Override

@ -0,0 +1,26 @@
package lol.pyr.znpcsplus.packets;
import com.github.retrooper.packetevents.PacketEventsAPI;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import lol.pyr.znpcsplus.api.entity.PropertyHolder;
import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl;
import lol.pyr.znpcsplus.entity.PacketEntity;
import lol.pyr.znpcsplus.metadata.MetadataFactory;
import lol.pyr.znpcsplus.scheduling.TaskScheduler;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.Map;
public class V1_11PacketFactory extends V1_10PacketFactory {
public V1_11PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI<Plugin> packetEvents, EntityPropertyRegistryImpl propertyRegistry) {
super(scheduler, metadataFactory, packetEvents, propertyRegistry);
}
@Override
public Map<Integer, EntityData> generateMetadata(Player player, PacketEntity entity, PropertyHolder properties) {
Map<Integer, EntityData> data = super.generateMetadata(player, entity, properties);
add(data, metadataFactory.usingItem(properties.getProperty(propertyRegistry.getByName("using_item", Boolean.class)), false, false));
return data;
}
}

@ -18,7 +18,7 @@ import org.bukkit.plugin.Plugin;
import java.util.Map;
import java.util.Optional;
public class V1_14PacketFactory extends V1_10PacketFactory {
public class V1_14PacketFactory extends V1_11PacketFactory {
public V1_14PacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory, PacketEventsAPI<Plugin> packetEvents, EntityPropertyRegistryImpl propertyRegistry) {
super(scheduler, metadataFactory, packetEvents, propertyRegistry);
}

@ -139,10 +139,10 @@ public class V1_8PacketFactory implements PacketFactory {
properties.getProperty(propertyRegistry.getByName("fire", Boolean.class)),
false,
properties.getProperty(propertyRegistry.getByName("invisible", Boolean.class)),
false)
);
false,
properties.getProperty(propertyRegistry.getByName("using_item", Boolean.class))
));
add(data, metadataFactory.silent(properties.getProperty(propertyRegistry.getByName("silent", Boolean.class))));
add(data, metadataFactory.usingItem(properties.getProperty(propertyRegistry.getByName("using_item", Boolean.class)), false, false));
add(data, metadataFactory.potionColor(properties.getProperty(propertyRegistry.getByName("potion_color", Color.class)).asRGB()));
add(data, metadataFactory.potionAmbient(properties.getProperty(propertyRegistry.getByName("potion_ambient", Boolean.class))));
if (properties.hasProperty(propertyRegistry.getByName("name"))) {

@ -23,7 +23,9 @@ public class V1_9PacketFactory extends V1_8PacketFactory {
add(data, metadataFactory.effects(properties.getProperty(propertyRegistry.getByName("fire", Boolean.class)),
properties.hasProperty(propertyRegistry.getByName("glow", Boolean.class)),
properties.getProperty(propertyRegistry.getByName("invisible", Boolean.class)),
false));
false,
properties.getProperty(propertyRegistry.getByName("using_item", Boolean.class))
));
return data;
}
}