Fix 1.8-1.15.2 bobbing
This commit is contained in:
1 parent
785346b4c7
commit
64d2cd07d9
2 files changed
+173
-55
No files matched your search
@@ -1,6 +1,10 @@
|
||||
package main.java.me.dniym.checks;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import main.java.me.dniym.IllegalStack;
|
||||
import main.java.me.dniym.enums.Msg;
|
||||
import main.java.me.dniym.enums.Protections;
|
||||
@@ -12,6 +16,7 @@ import org.bukkit.attribute.Attribute;
|
||||
import org.bukkit.attribute.AttributeModifier;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.CraftingInventory;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
@@ -53,51 +58,99 @@ public class BadAttributeCheck {
|
||||
|
||||
}
|
||||
|
||||
return is != null && is.getType() != Material.AIR && checkForBadCustomData(is, obj);
|
||||
return hasNonDefaultAttributeModifiers(is);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Pure predicate: true iff the item carries at least one AttributeModifier that
|
||||
* is NOT part of the vanilla default modifier set for its Material. Vanilla
|
||||
* defaults are exposed via ItemMeta on 1.20.5+, so a naive
|
||||
* hasAttributeModifiers() check false-positives every vanilla weapon/armor and
|
||||
* causes inventory churn when the periodic scanner rewrites the meta.
|
||||
*/
|
||||
public static boolean hasNonDefaultAttributeModifiers(ItemStack is) {
|
||||
|
||||
if (is == null || is.getType() == Material.AIR) {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
if (IllegalStack.isHasAttribAPI()) {
|
||||
|
||||
ItemMeta meta = is.getItemMeta();
|
||||
return meta != null && hasCustomModifier(meta, is.getType());
|
||||
|
||||
}
|
||||
|
||||
if (IllegalStack.isNbtAPI()) {
|
||||
|
||||
return NBTApiStuff.hasBadCustomDataLegacy(is);
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public static boolean checkForBadCustomData(ItemStack itemStack, Object obj) {
|
||||
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (IllegalStack.isHasAttribAPI()) {
|
||||
|
||||
if (itemMeta.hasAttributeModifiers()) {
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (itemMeta == null || !itemMeta.hasAttributeModifiers()) {
|
||||
|
||||
StringBuilder attribs = new StringBuilder();
|
||||
HashSet<Attribute> toRemove = new HashSet<>();
|
||||
for (Attribute a : itemMeta.getAttributeModifiers().keySet()) {
|
||||
|
||||
for (AttributeModifier st : itemMeta.getAttributeModifiers(a)) {
|
||||
|
||||
attribs.append(" ").append(st.getName()).append(" value: ").append(st.getAmount());
|
||||
|
||||
}
|
||||
|
||||
toRemove.add(a);
|
||||
|
||||
}
|
||||
|
||||
fListener.getLog().append(Msg.CustomAttribsRemoved3.getValue(itemStack, obj, attribs),
|
||||
Protections.RemoveCustomAttributes);
|
||||
|
||||
for (Attribute remove : toRemove) {
|
||||
|
||||
itemMeta.removeAttributeModifier(remove);
|
||||
|
||||
}
|
||||
|
||||
for (ItemFlag iFlag : itemMeta.getItemFlags()) {
|
||||
|
||||
itemMeta.removeItemFlags(iFlag);
|
||||
|
||||
}
|
||||
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
return true;
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
Set<UUID> defaultUuids = collectDefaultModifierUuids(itemStack.getType());
|
||||
Multimap<Attribute, AttributeModifier> mods = itemMeta.getAttributeModifiers();
|
||||
|
||||
StringBuilder attribs = new StringBuilder();
|
||||
boolean anyCustom = false;
|
||||
for (Map.Entry<Attribute, AttributeModifier> entry : mods.entries()) {
|
||||
|
||||
AttributeModifier mod = entry.getValue();
|
||||
if (!defaultUuids.contains(mod.getUniqueId())) {
|
||||
|
||||
anyCustom = true;
|
||||
attribs.append(" ").append(mod.getName()).append(" value: ").append(mod.getAmount());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!anyCustom) {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
fListener.getLog().append(Msg.CustomAttribsRemoved3.getValue(itemStack, obj, attribs),
|
||||
Protections.RemoveCustomAttributes);
|
||||
|
||||
for (Map.Entry<Attribute, AttributeModifier> entry : mods.entries()) {
|
||||
|
||||
AttributeModifier mod = entry.getValue();
|
||||
if (!defaultUuids.contains(mod.getUniqueId())) {
|
||||
|
||||
itemMeta.removeAttributeModifier(entry.getKey(), mod);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for (ItemFlag iFlag : itemMeta.getItemFlags()) {
|
||||
|
||||
itemMeta.removeItemFlags(iFlag);
|
||||
|
||||
}
|
||||
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
return true;
|
||||
|
||||
} else if (IllegalStack.isNbtAPI()) {
|
||||
|
||||
return NBTApiStuff.checkForBadCustomDataLegacy(itemStack, obj);
|
||||
@@ -113,4 +166,67 @@ public class BadAttributeCheck {
|
||||
|
||||
}
|
||||
|
||||
private static boolean hasCustomModifier(ItemMeta meta, Material type) {
|
||||
|
||||
if (!meta.hasAttributeModifiers()) {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
Set<UUID> defaultUuids = collectDefaultModifierUuids(type);
|
||||
Multimap<Attribute, AttributeModifier> mods = meta.getAttributeModifiers();
|
||||
for (AttributeModifier mod : mods.values()) {
|
||||
|
||||
if (!defaultUuids.contains(mod.getUniqueId())) {
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public static Set<UUID> collectDefaultModifierUuidsPublic(Material type) {
|
||||
|
||||
return collectDefaultModifierUuids(type);
|
||||
|
||||
}
|
||||
|
||||
private static Set<UUID> collectDefaultModifierUuids(Material type) {
|
||||
|
||||
Set<UUID> uuids = new HashSet<>();
|
||||
for (EquipmentSlot slot : EquipmentSlot.values()) {
|
||||
|
||||
try {
|
||||
|
||||
Multimap<Attribute, AttributeModifier> defaults = type.getDefaultAttributeModifiers(slot);
|
||||
if (defaults == null) {
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
for (AttributeModifier defMod : defaults.values()) {
|
||||
|
||||
uuids.add(defMod.getUniqueId());
|
||||
|
||||
}
|
||||
|
||||
} catch (Throwable ignored) {
|
||||
|
||||
// Method may not exist on older servers, or the slot is incompatible
|
||||
// with this material. Degrade gracefully: treat as no defaults known
|
||||
// for that slot.
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return uuids;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package main.java.me.dniym.utils;
|
||||
|
||||
import java.util.HashSet;
|
||||
import main.java.me.dniym.IllegalStack;
|
||||
import main.java.me.dniym.enums.Msg;
|
||||
import main.java.me.dniym.enums.Protections;
|
||||
@@ -216,19 +215,7 @@ public class NBTStuff {
|
||||
|
||||
public static boolean hasBadCustomData(ItemStack is) {
|
||||
|
||||
ItemMeta im = is.getItemMeta();
|
||||
|
||||
if (IllegalStack.isHasAttribAPI() && is.hasItemMeta() && im.hasAttributeModifiers()) {
|
||||
|
||||
return true;
|
||||
|
||||
} else if (IllegalStack.isNbtAPI()) {
|
||||
|
||||
return NBTApiStuff.hasBadCustomDataLegacy(is);
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
return main.java.me.dniym.checks.BadAttributeCheck.hasNonDefaultAttributeModifiers(is);
|
||||
|
||||
}
|
||||
|
||||
@@ -269,17 +256,27 @@ public class NBTStuff {
|
||||
|
||||
if (IllegalStack.isHasAttribAPI() && im.hasAttributeModifiers()) {
|
||||
|
||||
java.util.Set<java.util.UUID> defaultUuids = main.java.me.dniym.checks.BadAttributeCheck
|
||||
.collectDefaultModifierUuidsPublic(is.getType());
|
||||
com.google.common.collect.Multimap<Attribute, AttributeModifier> mods = im.getAttributeModifiers();
|
||||
|
||||
StringBuilder attribs = new StringBuilder();
|
||||
HashSet<Attribute> toRemove = new HashSet<>();
|
||||
for (Attribute a : im.getAttributeModifiers().keySet()) {
|
||||
boolean anyCustom = false;
|
||||
for (java.util.Map.Entry<Attribute, AttributeModifier> entry : mods.entries()) {
|
||||
|
||||
for (AttributeModifier st : im.getAttributeModifiers(a)) {
|
||||
AttributeModifier mod = entry.getValue();
|
||||
if (!defaultUuids.contains(mod.getUniqueId())) {
|
||||
|
||||
attribs.append(" ").append(st.getName()).append(" value: ").append(st.getAmount());
|
||||
anyCustom = true;
|
||||
attribs.append(" ").append(mod.getName()).append(" value: ").append(mod.getAmount());
|
||||
|
||||
}
|
||||
|
||||
toRemove.add(a);
|
||||
}
|
||||
|
||||
if (!anyCustom) {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
@@ -294,9 +291,14 @@ public class NBTStuff {
|
||||
|
||||
}
|
||||
|
||||
for (Attribute remove : toRemove) {
|
||||
for (java.util.Map.Entry<Attribute, AttributeModifier> entry : mods.entries()) {
|
||||
|
||||
im.removeAttributeModifier(remove);
|
||||
AttributeModifier mod = entry.getValue();
|
||||
if (!defaultUuids.contains(mod.getUniqueId())) {
|
||||
|
||||
im.removeAttributeModifier(entry.getKey(), mod);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user