Readded set/get horse armor. Added sanitizing of saved disguises loading + logging.

This commit is contained in:
libraryaddict 2019-05-24 19:20:55 +12:00
parent a834190209
commit 86d45754c3
2 changed files with 26 additions and 6 deletions

View File

@ -34,4 +34,12 @@ public class HorseWatcher extends AbstractHorseWatcher {
setData(MetaIndex.HORSE_COLOR, getColor().ordinal() & 0xFF | style.ordinal() << 8); setData(MetaIndex.HORSE_COLOR, getColor().ordinal() & 0xFF | style.ordinal() << 8);
sendData(MetaIndex.HORSE_COLOR); sendData(MetaIndex.HORSE_COLOR);
} }
public void setHorseArmor(ItemStack item) {
getEquipment().setChestplate(item);
}
public ItemStack getHorseArmor() {
return getEquipment().getChestplate();
}
} }

View File

@ -4,10 +4,12 @@ import com.comphenix.protocol.wrappers.WrappedBlockData;
import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.google.gson.*; import com.google.gson.*;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.mojang.authlib.properties.PropertyMap; import com.mojang.authlib.properties.PropertyMap;
import me.libraryaddict.disguise.disguisetypes.*; import me.libraryaddict.disguise.disguisetypes.*;
import me.libraryaddict.disguise.disguisetypes.watchers.ArrowWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.ArrowWatcher;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -61,11 +63,12 @@ public class SerializerFlagWatcher implements JsonDeserializer<FlagWatcher>, Jso
Field field = FlagWatcher.class.getDeclaredField(name); Field field = FlagWatcher.class.getDeclaredField(name);
field.setAccessible(true); field.setAccessible(true);
HashMap<Integer, Object> map = (HashMap<Integer, Object>) field.get(watcher); HashMap<Integer, Object> map = (HashMap<Integer, Object>) field.get(watcher);
int count = 0;
for (Map.Entry<Integer, Object> entry : map.entrySet()) { for (Map.Entry<Integer, Object> entry : map.entrySet()) {
if (entry.getValue() instanceof Double) { MetaIndex index = MetaIndex.getMetaIndex(flagWatcher, entry.getKey());
MetaIndex index = MetaIndex.getMetaIndex(flagWatcher, entry.getKey());
if (entry.getValue() instanceof Double) {
Object def = index.getDefault(); Object def = index.getDefault();
if (def instanceof Long) if (def instanceof Long)
@ -78,15 +81,24 @@ public class SerializerFlagWatcher implements JsonDeserializer<FlagWatcher>, Jso
entry.setValue(((Double) entry.getValue()).shortValue()); entry.setValue(((Double) entry.getValue()).shortValue());
else if (def instanceof Byte) else if (def instanceof Byte)
entry.setValue(((Double) entry.getValue()).byteValue()); entry.setValue(((Double) entry.getValue()).byteValue());
} else if (entry.getValue() instanceof Map) { } else if (entry.getValue() instanceof LinkedTreeMap) { // If it's deserialized incorrectly as a map
MetaIndex index = MetaIndex.getMetaIndex(flagWatcher, entry.getKey()); // If the default value is not VillagerData
if (!(index.getDefault() instanceof VillagerData)) { if (!(index.getDefault() instanceof VillagerData)) {
continue; continue;
} }
entry.setValue(new Gson().fromJson(new Gson().toJson(entry.getValue()),VillagerData.class)); entry.setValue(new Gson().fromJson(new Gson().toJson(entry.getValue()), VillagerData.class));
} }
// If the deserialized class is not the same class type as the default
if (!index.getDefault().getClass().isInstance(entry.getValue())) {
entry.setValue(index.getDefault());
count++;
}
}
if (count > 0) {
DisguiseUtilities.getLogger().info("Fixed " + count + " incorrect disguise flags on saved disguise");
} }
} }