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 me.libraryaddict.disguise.disguisetypes.*;
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.parser.DisguiseParseException;
import me.libraryaddict.disguise.utilities.parser.DisguiseParser;
import me.libraryaddict.disguise.utilities.parser.DisguisePerm;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
@ -138,22 +140,35 @@ public class DisguiseAPI {
continue;
}
watcher.setUnsafeData(index, obj.getRawValue());
watcher.setUnsafeData(index, obj.getRawValue());
// Update the meta for 0, otherwise boolean be weird
if (index == MetaIndex.ENTITY_META) {
watcher.setSprinting(watcher.isSprinting() && displayExtraAnimations);
watcher.setFlyingWithElytra(watcher.isFlyingWithElytra() && displayExtraAnimations);
watcher.setRightClicking(watcher.isRightClicking() && displayExtraAnimations);
watcher.setSneaking(watcher.isSneaking() && displayExtraAnimations);
watcher.setSwimming(watcher.isSwimming() && displayExtraAnimations);
if (!NmsVersion.v1_13.isSupported()) {
watcher.setRightClicking(watcher.isRightClicking() && displayExtraAnimations);
}
if (!displayExtraAnimations) {
Arrays.fill(watcher.getModifiedEntityAnimations(), false);
}
watcher.setGlowing(watcher.isGlowing());
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();
}
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++) {
if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations[i]) {
originalValue = (byte) (originalValue | 1 << i);
@ -294,10 +298,12 @@ public class FlagWatcher {
}
if (value != null) {
if (isEntityAnimationsAdded() && id == MetaIndex.ENTITY_META.getIndex()) {
value = addEntityAnimations((byte) value, (byte) watch.getRawValue());
if (isEntityAnimationsAdded() && (index == MetaIndex.ENTITY_META || index == MetaIndex.LIVING_META)) {
value = addEntityAnimations(index, (byte) value, (byte) watch.getRawValue());
doSneakCheck((Byte) value);
if (index == MetaIndex.ENTITY_META) {
doSneakCheck((Byte) value);
}
}
boolean isDirty = watch.getDirtyState();
@ -835,8 +841,8 @@ public class FlagWatcher {
Object value = entityValues.get(data.getIndex());
if (isEntityAnimationsAdded() && DisguiseConfig.isMetaPacketsEnabled() && data == MetaIndex.ENTITY_META) {
value = addEntityAnimations((byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0));
if (isEntityAnimationsAdded() && DisguiseConfig.isMetaPacketsEnabled() && (data == MetaIndex.ENTITY_META || data == MetaIndex.LIVING_META)) {
value = addEntityAnimations(data, (byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0));
}
WrappedWatchableObject watch = ReflectionManager.createWatchable(data, value);

View File

@ -387,7 +387,7 @@ public class MetaIndex<Y> {
/**
* 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

View File

@ -6,6 +6,7 @@ import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.BlockPosition;
import com.comphenix.protocol.wrappers.WrappedAttribute;
import com.comphenix.protocol.wrappers.WrappedAttribute.Builder;
import lombok.Getter;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
@ -25,6 +26,8 @@ public class LivingWatcher extends FlagWatcher {
private double maxHealth;
private boolean maxHealthSet;
private HashSet<String> potionEffects = new HashSet<>();
@Getter
private boolean[] modifiedLivingAnimations = new boolean[3];
public LivingWatcher(Disguise disguise) {
super(disguise);
@ -36,6 +39,7 @@ public class LivingWatcher extends FlagWatcher {
clone.potionEffects = (HashSet<String>) potionEffects.clone();
clone.maxHealth = maxHealth;
clone.maxHealthSet = maxHealthSet;
clone.modifiedLivingAnimations = Arrays.copyOf(modifiedLivingAnimations, modifiedLivingAnimations.length);
return clone;
}
@ -79,31 +83,58 @@ public class LivingWatcher extends FlagWatcher {
}*/
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) {
byte b0 = getData(MetaIndex.LIVING_HAND);
byte b0 = getData(MetaIndex.LIVING_META);
modifiedLivingAnimations[byteValue] = true;
if (flag) {
setData(MetaIndex.LIVING_HAND, (byte) (b0 | 1 << byteValue));
setData(MetaIndex.LIVING_META, (byte) (b0 | 1 << byteValue));
} 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)
public boolean isRightClicking() {
return getHandFlag(0);
return isRightHandInUse() && getHandFlag(0);
}
@NmsAddedIn(NmsVersion.v1_13)
public void setRightClicking(boolean setRightClicking) {
setHandInUse(true);
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)
public boolean isSpinning() {
return getHandFlag(2);
@ -262,4 +293,19 @@ public class LivingWatcher extends FlagWatcher {
setData(MetaIndex.LIVING_ARROWS, Math.max(0, Math.min(127, arrowsNo)));
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 lombok.Getter;
import lombok.Setter;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.SkinUtils;
import me.libraryaddict.disguise.utilities.translations.LibsMsg;
@ -65,11 +66,11 @@ public class MineSkinAPI {
}
private void printDebug(String message) {
if (!isDebugging()) {
if (!isDebugging() || LibsDisguises.getInstance() == null) {
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) {

View File

@ -8,6 +8,7 @@ import com.mojang.datafixers.util.Pair;
import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.Disguise;
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.LibsPackets;
import me.libraryaddict.disguise.utilities.packets.PacketsHandler;
@ -80,14 +81,14 @@ public class PacketHandlerEquipment implements IPacketHandler {
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) {
// Convert the datawatcher
List<WrappedWatchableObject> list = new ArrayList<>();
if (DisguiseConfig.isMetaPacketsEnabled()) {
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) {
list.add(watch);
@ -96,7 +97,7 @@ public class PacketHandlerEquipment implements IPacketHandler {
list = disguise.getWatcher().convert(observer, list);
} else {
for (WrappedWatchableObject obj : disguise.getWatcher().getWatchableObjects()) {
if (obj.getIndex() == MetaIndex.LIVING_HAND.getIndex()) {
if (obj.getIndex() == MetaIndex.LIVING_META.getIndex()) {
list.add(obj);
break;
}
@ -151,7 +152,7 @@ public class PacketHandlerEquipment implements IPacketHandler {
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) {
itemStack = packets.getPackets().get(0).getItemModifier().read(0);
}
@ -159,7 +160,7 @@ public class PacketHandlerEquipment implements IPacketHandler {
if (itemStack != null && itemStack.getType() != Material.AIR) {
// Convert the datawatcher
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()) {
WrappedWatchableObject watch =