InvalidSkinException class
Пакет: com.hypixel.hytale.server.core.cosmetics
Файл: com/hypixel/hytale/server/core/cosmetics/CosmeticsModule.java
extends: Exception
Поля (3)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private final String |
partId |
|
private final String |
partType |
|
|
var1 |
Методы (4)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
private static String |
formatMessageprivate static String formatMessage(String var0, @Nullable String var1) |
|
public String |
getPartIdpublic String getPartId() |
|
public String |
getPartTypepublic String getPartType() |
|
|
if if(var1 == null) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.cosmetics;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.EmptyExtraInfo;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.util.RawJsonReader;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.common.util.RandomUtil;
class="kw">import com.hypixel.hytale.common.util.StringUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.Options;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.asset.HytaleAssetStore;
class="kw">import com.hypixel.hytale.server.core.asset.LoadAssetEvent;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.ModelAsset;
class="kw">import com.hypixel.hytale.server.core.cosmetics.commands.EmoteCommand;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import java.util.Map;
class="kw">import java.util.Random;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class CosmeticsModule class="kw">extends JavaPlugin {
class="kw">public class="kw">static class="kw">final PluginManifest MANIFEST = PluginManifest.corePlugin(CosmeticsModule.class).build();
class="kw">static class="kw">final BuilderCodec<com.hypixel.hytale.protocol.PlayerSkin> PLAYER_SKIN_CODEC = BuilderCodec.builder(
com.hypixel.hytale.protocol.PlayerSkin.class, com.hypixel.hytale.protocol.PlayerSkin::new
)
.append(
new KeyedCodec<>("bodyCharacteristic", Codec.STRING, false, true), (var0, var1) -> var0.bodyCharacteristic = var1, var0 -> var0.bodyCharacteristic
)
.add()
.append(new KeyedCodec<>("cape", Codec.STRING, false, true), (var0, var1) -> var0.cape = var1, var0 -> var0.cape)
.add()
.append(new KeyedCodec<>("earAccessory", Codec.STRING, false, true), (var0, var1) -> var0.earAccessory = var1, var0 -> var0.earAccessory)
.add()
.append(new KeyedCodec<>("ears", Codec.STRING, false, true), (var0, var1) -> var0.ears = var1, var0 -> var0.ears)
.add()
.append(new KeyedCodec<>("eyebrows", Codec.STRING, false, true), (var0, var1) -> var0.eyebrows = var1, var0 -> var0.eyebrows)
.add()
.append(new KeyedCodec<>("eyes", Codec.STRING, false, true), (var0, var1) -> var0.eyes = var1, var0 -> var0.eyes)
.add()
.append(new KeyedCodec<>("face", Codec.STRING, false, true), (var0, var1) -> var0.face = var1, var0 -> var0.face)
.add()
.append(new KeyedCodec<>("faceAccessory", Codec.STRING, false, true), (var0, var1) -> var0.faceAccessory = var1, var0 -> var0.faceAccessory)
.add()
.append(new KeyedCodec<>("facialHair", Codec.STRING, false, true), (var0, var1) -> var0.facialHair = var1, var0 -> var0.facialHair)
.add()
.append(new KeyedCodec<>("gloves", Codec.STRING, false, true), (var0, var1) -> var0.gloves = var1, var0 -> var0.gloves)
.add()
.append(new KeyedCodec<>("haircut", Codec.STRING, false, true), (var0, var1) -> var0.haircut = var1, var0 -> var0.haircut)
.add()
.append(new KeyedCodec<>("headAccessory", Codec.STRING, false, true), (var0, var1) -> var0.headAccessory = var1, var0 -> var0.headAccessory)
.add()
.append(new KeyedCodec<>("mouth", Codec.STRING, false, true), (var0, var1) -> var0.mouth = var1, var0 -> var0.mouth)
.add()
.append(new KeyedCodec<>("overpants", Codec.STRING, false, true), (var0, var1) -> var0.overpants = var1, var0 -> var0.overpants)
.add()
.append(new KeyedCodec<>("overtop", Codec.STRING, false, true), (var0, var1) -> var0.overtop = var1, var0 -> var0.overtop)
.add()
.append(new KeyedCodec<>("pants", Codec.STRING, false, true), (var0, var1) -> var0.pants = var1, var0 -> var0.pants)
.add()
.append(new KeyedCodec<>("shoes", Codec.STRING, false, true), (var0, var1) -> var0.shoes = var1, var0 -> var0.shoes)
.add()
.append(new KeyedCodec<>("skinFeature", Codec.STRING, false, true), (var0, var1) -> var0.skinFeature = var1, var0 -> var0.skinFeature)
.add()
.append(new KeyedCodec<>("undertop", Codec.STRING, false, true), (var0, var1) -> var0.undertop = var1, var0 -> var0.undertop)
.add()
.append(new KeyedCodec<>("underwear", Codec.STRING, false, true), (var0, var1) -> var0.underwear = var1, var0 -> var0.underwear)
.add()
.build();
class="kw">private class="kw">static CosmeticsModule INSTANCE;
class="kw">private CosmeticRegistry registry;
class="kw">public CosmeticsModule(@Nonnull JavaPluginInit var1) {
super(var1);
INSTANCE = this;
}
@Override
class="kw">protected void setup() {
this.registry = new CosmeticRegistry(AssetModule.get().getBaseAssetPack());
this.getCommandRegistry().registerCommand(new EmoteCommand());
if (Options.getOptionSet().has(Options.VALIDATE_ASSETS)) {
this.getEventRegistry().register((short)64, LoadAssetEvent.class, this::validateGeneratedSkin);
}
AssetRegistry.register(
((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
EmoteAsset.class, new IndexedLookupTableAssetMap<>(EmoteAsset[]::new)
)
.setPath("Emote"))
.setCodec(EmoteAsset.CODEC))
.setKeyFunction(EmoteAsset::getId))
.setPacketGenerator(new EmoteAssetPacketGenerator())
.setReplaceOnRemove(EmoteAsset::new))
.build()
);
}
class="kw">public CosmeticRegistry getRegistry() {
class="kw">return this.registry;
}
class="kw">private void validateGeneratedSkin(@Nonnull LoadAssetEvent var1) {
for (int var2 = 0; var2 < 10; var2++) {
com.hypixel.hytale.protocol.PlayerSkin var3 = this.generateRandomSkin(new Random(var2));
try {
this.validateSkin(var3);
} catch (CosmeticsModule.InvalidSkinException var5) {
var1.failed(true, var5.getMessage());
class="kw">return;
}
}
}
@Nullable
class="kw">public Model createRandomModel(@Nonnull Random var1) {
com.hypixel.hytale.protocol.PlayerSkin var2 = this.generateRandomSkin(var1);
class="kw">return get().createModel(var2);
}
@Nullable
class="kw">public Model createModel(@Nonnull com.hypixel.hytale.protocol.PlayerSkin var1) {
class="kw">return this.createModel(var1, 1.0F);
}
@Nullable
class="kw">public Model createModel(@Nonnull com.hypixel.hytale.protocol.PlayerSkin var1, float var2) {
try {
this.validateSkin(var1);
} catch (CosmeticsModule.InvalidSkinException var4) {
((HytaleLogger.Api)this.getLogger().at(Level.WARNING).withCause(var4)).log("Was passed an invalid skin %s", var1);
class="kw">return null;
}
ModelAsset var3 = ModelAsset.getAssetMap().getAsset("Player");
class="kw">return Model.createScaledModel(var3, var2, null);
}
@Nullable
class="kw">public com.hypixel.hytale.protocol.PlayerSkin parseSkinFromJson(@Nonnull String var1) {
try {
RawJsonReader var2 = RawJsonReader.fromJsonString(var1);
class="kw">return PLAYER_SKIN_CODEC.decodeJson(var2, EmptyExtraInfo.EMPTY);
} catch (Exception var3) {
((HytaleLogger.Api)this.getLogger().at(Level.WARNING).withCause(var3)).log("Failed to parse skin JSON");
class="kw">return null;
}
}
class="kw">public void validateSkin(@Nonnull com.hypixel.hytale.protocol.PlayerSkin var1) class="kw">throws CosmeticsModule.InvalidSkinException {
if (var1 == null) {
throw new CosmeticsModule.InvalidSkinException("skin", null);
}
if (var1.face == null || !this.registry.getFaces().containsKey(var1.face)) {
throw new CosmeticsModule.InvalidSkinException("face", var1.face);
}
if (var1.ears == null || !this.registry.getEars().containsKey(var1.ears)) {
throw new CosmeticsModule.InvalidSkinException("ears", var1.ears);
}
if (var1.mouth == null || !this.registry.getMouths().containsKey(var1.mouth)) {
throw new CosmeticsModule.InvalidSkinException("mouth", var1.mouth);
}
if (!this.isValidAttachment(this.registry.getBodyCharacteristics(), var1.bodyCharacteristic, true)) {
throw new CosmeticsModule.InvalidSkinException("body", var1.bodyCharacteristic);
}
if (!this.isValidAttachment(this.registry.getUnderwear(), var1.underwear, true)) {
throw new CosmeticsModule.InvalidSkinException("underwear", var1.underwear);
}
if (!this.isValidAttachment(this.registry.getEyes(), var1.eyes, true)) {
throw new CosmeticsModule.InvalidSkinException("eyes", var1.eyes);
}
if (!this.isValidAttachment(this.registry.getSkinFeatures(), var1.skinFeature)) {
throw new CosmeticsModule.InvalidSkinException("skin feature", var1.skinFeature);
}
if (!this.isValidAttachment(this.registry.getEyebrows(), var1.eyebrows)) {
throw new CosmeticsModule.InvalidSkinException("eyebrows", var1.eyebrows);
}
if (!this.isValidAttachment(this.registry.getPants(), var1.pants)) {
throw new CosmeticsModule.InvalidSkinException("pants", var1.pants);
}
if (!this.isValidAttachment(this.registry.getOverpants(), var1.overpants)) {
throw new CosmeticsModule.InvalidSkinException("overpants", var1.overpants);
}
if (!this.isValidAttachment(this.registry.getShoes(), var1.shoes)) {
throw new CosmeticsModule.InvalidSkinException("shoes", var1.shoes);
}
if (!this.isValidAttachment(this.registry.getUndertops(), var1.undertop)) {
throw new CosmeticsModule.InvalidSkinException("undertop", var1.undertop);
}
if (!this.isValidAttachment(this.registry.getOvertops(), var1.overtop)) {
throw new CosmeticsModule.InvalidSkinException("overtop", var1.overtop);
}
if (!this.isValidAttachment(this.registry.getGloves(), var1.gloves)) {
throw new CosmeticsModule.InvalidSkinException("gloves", var1.gloves);
}
if (!this.isValidAttachment(this.registry.getHeadAccessories(), var1.headAccessory)) {
throw new CosmeticsModule.InvalidSkinException("head accessory", var1.headAccessory);
}
if (!this.isValidAttachment(this.registry.getFaceAccessories(), var1.faceAccessory)) {
throw new CosmeticsModule.InvalidSkinException("face accessory", var1.faceAccessory);
}
if (!this.isValidAttachment(this.registry.getEarAccessories(), var1.earAccessory)) {
throw new CosmeticsModule.InvalidSkinException("ear accessory", var1.earAccessory);
}
if (!this.isValidHaircutAttachment(var1.haircut, var1.headAccessory)) {
throw new CosmeticsModule.InvalidSkinException("haircut", var1.haircut);
}
if (!this.isValidAttachment(this.registry.getFacialHairs(), var1.facialHair)) {
throw new CosmeticsModule.InvalidSkinException("facial hair", var1.facialHair);
}
if (!this.isValidAttachment(this.registry.getCapes(), var1.cape)) {
throw new CosmeticsModule.InvalidSkinException("cape", var1.cape);
}
}
class="kw">private boolean isValidAttachment(@Nonnull Map<String, PlayerSkinPart> var1, String var2) {
class="kw">return this.isValidAttachment(var1, var2, false);
}
class="kw">private boolean isValidTexture(@Nonnull PlayerSkinPart var1, String var2, String var3) {
if (var1.getGradientSet() != null && this.registry.getGradientSets().get(var1.getGradientSet()).getGradients().containsKey(var3)) {
class="kw">return true;
} else {
class="kw">return var1.getVariants() != null ? var1.getVariants().get(var2).getTextures().containsKey(var3) : var1.getTextures().containsKey(var3);
}
}
class="kw">private boolean isValidAttachment(@Nonnull Map<String, PlayerSkinPart> var1, @Nullable String var2, boolean var3) {
if (var2 == null) {
class="kw">return !var3;
}
String[] var4 = var2.split("\\.", -1);
PlayerSkinPart var5 = var1.get(var4[0]);
if (var5 == null) {
class="kw">return false;
}
String var6 = var4.length > 2 && !var4[2].isEmpty() ? var4[2] : null;
class="kw">return var5.getVariants() != null && !var5.getVariants().containsKey(var6) ? false : this.isValidTexture(var5, var6, var4[1]);
}
class="kw">private boolean isValidHaircutAttachment(@Nullable String var1, @Nullable String var2) {
if (var1 == null) {
class="kw">return true;
}
Map var3 = this.registry.getHaircuts();
String[] var4 = var1.split("\\.", -1);
String var5 = var4[0];
String var6 = var4.length > 1 && !var4[1].isEmpty() ? var4[1] : null;
if (var2 != null) {
var4 = var2.split("\\.", -1);
String var7 = var4[0];
PlayerSkinPart var8 = this.registry.getHeadAccessories().get(var7);
if (var8 != null) {
class="kw">switch (var8.getHeadAccessoryType()) {
case HalfCovering:
PlayerSkinPart var9 = var3.get(var5);
if (var9 == null) {
class="kw">return false;
}
if (var9.doesRequireGenericHaircut()) {
PlayerSkinPart var10 = var3.get("Generic" + var9.getHairType());
class="kw">return this.isValidAttachment(var3, var10.getId() + "." + var6, false);
}
break;
case FullyCovering:
class="kw">return this.isValidAttachment(var3, var1);
case Simple:
}
}
}
class="kw">return this.isValidAttachment(var3, var1);
}
class="kw">public class="kw">static CosmeticsModule get() {
class="kw">return INSTANCE;
}
@Nonnull
class="kw">public com.hypixel.hytale.protocol.PlayerSkin generateRandomSkin(@Nonnull Random var1) {
String var2 = this.randomSkinPart(this.registry.getBodyCharacteristics(), true, var1);
String var3 = this.randomSkinPart(this.registry.getUnderwear(), true, var1);
String var4 = this.randomSkinPart(this.registry.getFaces(), true, false, var1);
String var5 = this.randomSkinPart(this.registry.getEars(), true, false, var1);
String var6 = this.randomSkinPart(this.registry.getMouths(), true, false, var1);
String var7 = this.randomSkinPart(this.registry.getEyes(), true, var1);
String var8 = null;
if (var1.nextInt(10) > 4) {
var8 = this.randomSkinPart(this.registry.getFacialHairs(), var1);
}
String var9 = this.randomSkinPart(this.registry.getHaircuts(), var1);
String var10 = this.randomSkinPart(this.registry.getEyebrows(), var1);
String var11 = this.randomSkinPart(this.registry.getPants(), var1);
String var12 = null;
String var13 = this.randomSkinPart(this.registry.getUndertops(), var1);
String var14 = this.randomSkinPart(this.registry.getOvertops(), var1);
String var15 = this.randomSkinPart(this.registry.getShoes(), var1);
String var16 = null;
if (var1.nextInt(10) > 8) {
var16 = this.randomSkinPart(this.registry.getHeadAccessories(), var1);
}
String var17 = null;
if (var1.nextInt(10) > 8) {
var17 = this.randomSkinPart(this.registry.getFaceAccessories(), var1);
}
String var18 = null;
if (var1.nextInt(10) > 8) {
var18 = this.randomSkinPart(this.registry.getEarAccessories(), var1);
}
String var19 = null;
if (var1.nextInt(10) > 8) {
var19 = this.randomSkinPart(this.registry.getSkinFeatures(), var1);
}
String var20 = null;
class="kw">return new com.hypixel.hytale.protocol.PlayerSkin(
var2, var3, var4, var7, var5, var6, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, null
);
}
@Nullable
class="kw">private String randomSkinPart(@Nonnull Map<String, PlayerSkinPart> var1, @Nonnull Random var2) {
class="kw">return this.randomSkinPart(var1, false, var2);
}
@Nullable
class="kw">private String randomSkinPart(@Nonnull Map<String, PlayerSkinPart> var1, boolean var2, @Nonnull Random var3) {
class="kw">return this.randomSkinPart(var1, var2, true, var3);
}
@Nullable
class="kw">private String randomSkinPart(@Nonnull Map<String, PlayerSkinPart> var1, boolean var2, boolean var3, @Nonnull Random var4) {
PlayerSkinPart[] var5 = var1.values().toArray(PlayerSkinPart[]::new);
PlayerSkinPart var6 = var2 ? RandomUtil.selectRandom(var5, var4) : RandomUtil.selectRandomOrNull(var5, var4);
if (var6 == null) {
class="kw">return null;
}
if (!var3) {
class="kw">return var6.getId();
}
String[] var7 = ArrayUtil.EMPTY_STRING_ARRAY;
if (var6.getGradientSet() != null) {
var7 = this.registry.getGradientSets().get(var6.getGradientSet()).getGradients().keySet().toArray(String[]::new);
}
Map var8 = var6.getTextures();
String var9 = null;
if (var6.getVariants() != null) {
var9 = RandomUtil.selectRandom(var6.getVariants().keySet().toArray(String[]::new), var4);
var8 = var6.getVariants().get(var9).getTextures();
}
if (var8 != null) {
var7 = ArrayUtil.combine(var7, var8.keySet().toArray(String[]::new));
}
String var10 = RandomUtil.selectRandom(var7, var4);
class="kw">return var9 == null ? var6.getId() + "." + var10 : var6.getId() + "." + var10 + "." + var9;
}
class="kw">public class="kw">static class InvalidSkinException class="kw">extends Exception {
class="kw">private class="kw">final String partType;
class="kw">private class="kw">final String partId;
class="kw">public InvalidSkinException(String var1, @Nullable String var2) {
super(formatMessage(var1, var2));
this.partType = var1;
this.partId = var2;
}
class="kw">private class="kw">static String formatMessage(String var0, @Nullable String var1) {
if (var1 == null) {
class="kw">return "Missing required " + var0;
}
var1 = StringUtil.sanitizeAsciiString(var1);
class="kw">return "Unknown " + var0 + ": " + var1;
}
class="kw">public String getPartType() {
class="kw">return this.partType;
}
@Nullable
class="kw">public String getPartId() {
class="kw">return this.partId;
}
}
}