Add isLeftClicking and fix isRightClicking, didn't check backwards compatibility, may need to be renamed. Fixes #617

This commit is contained in:
libraryaddict 2021-09-11 01:28:01 +12:00
parent 92eaa03b51
commit 3e6e4b3932
6 changed files with 91 additions and 22 deletions

View File

@ -6,10 +6,12 @@ import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import lombok.Getter; import lombok.Getter;
import me.libraryaddict.disguise.disguisetypes.*; import me.libraryaddict.disguise.disguisetypes.*;
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType;
import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher;
import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; import me.libraryaddict.disguise.utilities.parser.DisguiseParseException;
import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.parser.DisguiseParser;
import me.libraryaddict.disguise.utilities.parser.DisguisePerm; import me.libraryaddict.disguise.utilities.parser.DisguisePerm;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -144,16 +146,29 @@ public class DisguiseAPI {
if (index == MetaIndex.ENTITY_META) { if (index == MetaIndex.ENTITY_META) {
watcher.setSprinting(watcher.isSprinting() && displayExtraAnimations); watcher.setSprinting(watcher.isSprinting() && displayExtraAnimations);
watcher.setFlyingWithElytra(watcher.isFlyingWithElytra() && displayExtraAnimations); watcher.setFlyingWithElytra(watcher.isFlyingWithElytra() && displayExtraAnimations);
watcher.setRightClicking(watcher.isRightClicking() && displayExtraAnimations);
watcher.setSneaking(watcher.isSneaking() && displayExtraAnimations); watcher.setSneaking(watcher.isSneaking() && displayExtraAnimations);
watcher.setSwimming(watcher.isSwimming() && displayExtraAnimations); watcher.setSwimming(watcher.isSwimming() && displayExtraAnimations);
if (!NmsVersion.v1_13.isSupported()) {
watcher.setRightClicking(watcher.isRightClicking() && displayExtraAnimations);
}
if (!displayExtraAnimations) { if (!displayExtraAnimations) {
Arrays.fill(watcher.getModifiedEntityAnimations(), false); Arrays.fill(watcher.getModifiedEntityAnimations(), false);
} }
watcher.setGlowing(watcher.isGlowing()); watcher.setGlowing(watcher.isGlowing());
watcher.setInvisible(watcher.isInvisible()); watcher.setInvisible(watcher.isInvisible());
} else if (index == MetaIndex.LIVING_META && NmsVersion.v1_13.isSupported()) {
LivingWatcher livingWatcher = (LivingWatcher) watcher;
livingWatcher.setRightClicking(livingWatcher.isRightClicking() && displayExtraAnimations);
livingWatcher.setLeftClicking(livingWatcher.isLeftClicking() && displayExtraAnimations);
livingWatcher.setSpinning(livingWatcher.isSpinning() && displayExtraAnimations);
if (!displayExtraAnimations) {
Arrays.fill(livingWatcher.getModifiedLivingAnimations(), false);
}
} }
} }

View File

@ -168,7 +168,11 @@ public class FlagWatcher {
sendHeadPacket(); sendHeadPacket();
} }
private byte addEntityAnimations(byte originalValue, byte entityValue) { protected byte addEntityAnimations(MetaIndex index, byte originalValue, byte entityValue) {
if (index != MetaIndex.ENTITY_META) {
return originalValue;
}
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations[i]) { if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations[i]) {
originalValue = (byte) (originalValue | 1 << i); originalValue = (byte) (originalValue | 1 << i);
@ -294,11 +298,13 @@ public class FlagWatcher {
} }
if (value != null) { if (value != null) {
if (isEntityAnimationsAdded() && id == MetaIndex.ENTITY_META.getIndex()) { if (isEntityAnimationsAdded() && (index == MetaIndex.ENTITY_META || index == MetaIndex.LIVING_META)) {
value = addEntityAnimations((byte) value, (byte) watch.getRawValue()); value = addEntityAnimations(index, (byte) value, (byte) watch.getRawValue());
if (index == MetaIndex.ENTITY_META) {
doSneakCheck((Byte) value); doSneakCheck((Byte) value);
} }
}
boolean isDirty = watch.getDirtyState(); boolean isDirty = watch.getDirtyState();
@ -835,8 +841,8 @@ public class FlagWatcher {
Object value = entityValues.get(data.getIndex()); Object value = entityValues.get(data.getIndex());
if (isEntityAnimationsAdded() && DisguiseConfig.isMetaPacketsEnabled() && data == MetaIndex.ENTITY_META) { if (isEntityAnimationsAdded() && DisguiseConfig.isMetaPacketsEnabled() && (data == MetaIndex.ENTITY_META || data == MetaIndex.LIVING_META)) {
value = addEntityAnimations((byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); value = addEntityAnimations(data, (byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0));
} }
WrappedWatchableObject watch = ReflectionManager.createWatchable(data, value); WrappedWatchableObject watch = ReflectionManager.createWatchable(data, value);

View File

@ -387,7 +387,7 @@ public class MetaIndex<Y> {
/** /**
* The main hand of the living entity * The main hand of the living entity
*/ */
public static MetaIndex<Byte> LIVING_HAND = new MetaIndex<>(LivingWatcher.class, 0, (byte) 0); public static MetaIndex<Byte> LIVING_META = new MetaIndex<>(LivingWatcher.class, 0, (byte) 0);
/** /**
* How much health the living entity has, generally only visible on bosses due to their health bar * How much health the living entity has, generally only visible on bosses due to their health bar

View File

@ -6,6 +6,7 @@ import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.BlockPosition;
import com.comphenix.protocol.wrappers.WrappedAttribute; import com.comphenix.protocol.wrappers.WrappedAttribute;
import com.comphenix.protocol.wrappers.WrappedAttribute.Builder; import com.comphenix.protocol.wrappers.WrappedAttribute.Builder;
import lombok.Getter;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
@ -25,6 +26,8 @@ public class LivingWatcher extends FlagWatcher {
private double maxHealth; private double maxHealth;
private boolean maxHealthSet; private boolean maxHealthSet;
private HashSet<String> potionEffects = new HashSet<>(); private HashSet<String> potionEffects = new HashSet<>();
@Getter
private boolean[] modifiedLivingAnimations = new boolean[3];
public LivingWatcher(Disguise disguise) { public LivingWatcher(Disguise disguise) {
super(disguise); super(disguise);
@ -36,6 +39,7 @@ public class LivingWatcher extends FlagWatcher {
clone.potionEffects = (HashSet<String>) potionEffects.clone(); clone.potionEffects = (HashSet<String>) potionEffects.clone();
clone.maxHealth = maxHealth; clone.maxHealth = maxHealth;
clone.maxHealthSet = maxHealthSet; clone.maxHealthSet = maxHealthSet;
clone.modifiedLivingAnimations = Arrays.copyOf(modifiedLivingAnimations, modifiedLivingAnimations.length);
return clone; return clone;
} }
@ -79,31 +83,58 @@ public class LivingWatcher extends FlagWatcher {
}*/ }*/
private boolean getHandFlag(int byteValue) { private boolean getHandFlag(int byteValue) {
return (getData(MetaIndex.LIVING_HAND) & 1 << byteValue) != 0; return (getData(MetaIndex.LIVING_META) & 1 << byteValue) != 0;
} }
private void setHandFlag(int byteValue, boolean flag) { private void setHandFlag(int byteValue, boolean flag) {
byte b0 = getData(MetaIndex.LIVING_HAND); byte b0 = getData(MetaIndex.LIVING_META);
modifiedLivingAnimations[byteValue] = true;
if (flag) { if (flag) {
setData(MetaIndex.LIVING_HAND, (byte) (b0 | 1 << byteValue)); setData(MetaIndex.LIVING_META, (byte) (b0 | 1 << byteValue));
} else { } else {
setData(MetaIndex.LIVING_HAND, (byte) (b0 & ~(1 << byteValue))); setData(MetaIndex.LIVING_META, (byte) (b0 & ~(1 << byteValue)));
} }
sendData(MetaIndex.LIVING_HAND); sendData(MetaIndex.LIVING_META);
}
private boolean isRightHandInUse() {
return getHandFlag(1);
}
private void setHandInUse(boolean rightHand) {
if (isRightHandInUse() == rightHand) {
return;
}
setHandFlag(1, rightHand);
} }
@NmsAddedIn(NmsVersion.v1_13) @NmsAddedIn(NmsVersion.v1_13)
public boolean isRightClicking() { public boolean isRightClicking() {
return getHandFlag(0); return isRightHandInUse() && getHandFlag(0);
} }
@NmsAddedIn(NmsVersion.v1_13) @NmsAddedIn(NmsVersion.v1_13)
public void setRightClicking(boolean setRightClicking) { public void setRightClicking(boolean setRightClicking) {
setHandInUse(true);
setHandFlag(0, setRightClicking); setHandFlag(0, setRightClicking);
} }
@NmsAddedIn(NmsVersion.v1_13)
public boolean isLeftClicking() {
return !isRightHandInUse() && getHandFlag(0);
}
@NmsAddedIn(NmsVersion.v1_13)
public void setLeftClicking(boolean setLeftClicking) {
setHandInUse(false);
setHandFlag(0, setLeftClicking);
}
@NmsAddedIn(NmsVersion.v1_13) @NmsAddedIn(NmsVersion.v1_13)
public boolean isSpinning() { public boolean isSpinning() {
return getHandFlag(2); return getHandFlag(2);
@ -262,4 +293,19 @@ public class LivingWatcher extends FlagWatcher {
setData(MetaIndex.LIVING_ARROWS, Math.max(0, Math.min(127, arrowsNo))); setData(MetaIndex.LIVING_ARROWS, Math.max(0, Math.min(127, arrowsNo)));
sendData(MetaIndex.LIVING_ARROWS); sendData(MetaIndex.LIVING_ARROWS);
} }
@Override
protected byte addEntityAnimations(MetaIndex index, byte originalValue, byte entityValue) {
if (index != MetaIndex.LIVING_META) {
return super.addEntityAnimations(index, originalValue, entityValue);
}
for (int i = 0; i < 3; i++) {
if ((entityValue & 1 << i) != 0 && !modifiedLivingAnimations[i]) {
originalValue = (byte) (originalValue | 1 << i);
}
}
return originalValue;
}
} }

View File

@ -3,6 +3,7 @@ package me.libraryaddict.disguise.utilities.mineskin;
import com.google.gson.Gson; import com.google.gson.Gson;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.SkinUtils; import me.libraryaddict.disguise.utilities.SkinUtils;
import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.translations.LibsMsg;
@ -65,11 +66,11 @@ public class MineSkinAPI {
} }
private void printDebug(String message) { private void printDebug(String message) {
if (!isDebugging()) { if (!isDebugging() || LibsDisguises.getInstance() == null) {
return; return;
} }
System.out.println("[MineSkinAPI] " + message); LibsDisguises.getInstance().getLogger().info("[MineSkinAPI] " + message);
} }
private MineSkinResponse doPost(SkinUtils.SkinCallback callback, String path, String skinUrl, File file, SkinUtils.ModelType modelType) { private MineSkinResponse doPost(SkinUtils.SkinCallback callback, String path, String skinUrl, File file, SkinUtils.ModelType modelType) {

View File

@ -8,6 +8,7 @@ import com.mojang.datafixers.util.Pair;
import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher;
import me.libraryaddict.disguise.utilities.packets.IPacketHandler; import me.libraryaddict.disguise.utilities.packets.IPacketHandler;
import me.libraryaddict.disguise.utilities.packets.LibsPackets; import me.libraryaddict.disguise.utilities.packets.LibsPackets;
import me.libraryaddict.disguise.utilities.packets.PacketsHandler; import me.libraryaddict.disguise.utilities.packets.PacketsHandler;
@ -80,14 +81,14 @@ public class PacketHandlerEquipment implements IPacketHandler {
itemStack = ReflectionManager.getBukkitItem(pair.getSecond()); itemStack = ReflectionManager.getBukkitItem(pair.getSecond());
} }
if (disguise.getWatcher().isRightClicking() && (slot == EquipmentSlot.HAND || slot == EquipmentSlot.OFF_HAND)) { if ((disguise.getWatcher().isRightClicking() || (disguise.getWatcher() instanceof LivingWatcher && ((LivingWatcher) disguise.getWatcher()).isLeftClicking())) && (slot == EquipmentSlot.HAND || slot == EquipmentSlot.OFF_HAND)) {
if (itemStack != null && itemStack.getType() != Material.AIR) { if (itemStack != null && itemStack.getType() != Material.AIR) {
// Convert the datawatcher // Convert the datawatcher
List<WrappedWatchableObject> list = new ArrayList<>(); List<WrappedWatchableObject> list = new ArrayList<>();
if (DisguiseConfig.isMetaPacketsEnabled()) { if (DisguiseConfig.isMetaPacketsEnabled()) {
WrappedWatchableObject watch = ReflectionManager WrappedWatchableObject watch = ReflectionManager
.createWatchable(MetaIndex.LIVING_HAND, WrappedDataWatcher.getEntityWatcher(entity).getByte(MetaIndex.LIVING_HAND.getIndex())); .createWatchable(MetaIndex.LIVING_META, WrappedDataWatcher.getEntityWatcher(entity).getByte(MetaIndex.LIVING_META.getIndex()));
if (watch != null) { if (watch != null) {
list.add(watch); list.add(watch);
@ -96,7 +97,7 @@ public class PacketHandlerEquipment implements IPacketHandler {
list = disguise.getWatcher().convert(observer, list); list = disguise.getWatcher().convert(observer, list);
} else { } else {
for (WrappedWatchableObject obj : disguise.getWatcher().getWatchableObjects()) { for (WrappedWatchableObject obj : disguise.getWatcher().getWatchableObjects()) {
if (obj.getIndex() == MetaIndex.LIVING_HAND.getIndex()) { if (obj.getIndex() == MetaIndex.LIVING_META.getIndex()) {
list.add(obj); list.add(obj);
break; break;
} }
@ -151,7 +152,7 @@ public class PacketHandlerEquipment implements IPacketHandler {
equipPacket.getModifier().write(2, ReflectionManager.getNmsItem(itemStack.getType() == Material.AIR ? null : itemStack)); equipPacket.getModifier().write(2, ReflectionManager.getNmsItem(itemStack.getType() == Material.AIR ? null : itemStack));
} }
if (disguise.getWatcher().isRightClicking() && (slot == EquipmentSlot.HAND || slot == EquipmentSlot.OFF_HAND)) { if ((disguise.getWatcher().isRightClicking() || (disguise.getWatcher() instanceof LivingWatcher && ((LivingWatcher) disguise.getWatcher()).isLeftClicking())) && (slot == EquipmentSlot.HAND || slot == EquipmentSlot.OFF_HAND)) {
if (itemStack == null) { if (itemStack == null) {
itemStack = packets.getPackets().get(0).getItemModifier().read(0); itemStack = packets.getPackets().get(0).getItemModifier().read(0);
} }
@ -159,7 +160,7 @@ public class PacketHandlerEquipment implements IPacketHandler {
if (itemStack != null && itemStack.getType() != Material.AIR) { if (itemStack != null && itemStack.getType() != Material.AIR) {
// Convert the datawatcher // Convert the datawatcher
List<WrappedWatchableObject> list = new ArrayList<>(); List<WrappedWatchableObject> list = new ArrayList<>();
MetaIndex toUse = NmsVersion.v1_13.isSupported() ? MetaIndex.LIVING_HAND : MetaIndex.ENTITY_META; MetaIndex toUse = NmsVersion.v1_13.isSupported() ? MetaIndex.LIVING_META : MetaIndex.ENTITY_META;
if (DisguiseConfig.isMetaPacketsEnabled()) { if (DisguiseConfig.isMetaPacketsEnabled()) {
WrappedWatchableObject watch = WrappedWatchableObject watch =