CosmeticsModule class

Пакет: com.hypixel.hytale.server.core.cosmetics

Файл: com/hypixel/hytale/server/core/cosmetics/CosmeticsModule.java

extends: JavaPlugin

Поля (57)

МодификаторыТипИмя
INSTANCE
final PluginManifest MANIFEST
break
private final String partId
private final String partType
return
var1
PlayerSkinPart var10
String var10
String var10
String var11
String var12
String var13
String var14
String var15
String var16
var16
String var17
var17
String var18
var18
String var19
var19
com.hypixel.hytale.protocol.PlayerSkin var2
RawJsonReader var2
String var2
String var20
com.hypixel.hytale.protocol.PlayerSkin var3
ModelAsset var3
Map var3
String var3
String[] var4
String[] var4
var4
String var4
PlayerSkinPart var5
String var5
String var5
PlayerSkinPart[] var5
String var6
String var6
String var6
PlayerSkinPart var6
String var7
String var7
String[] var7
var7
var7
PlayerSkinPart var8
String var8
var8
Map var8
var8
PlayerSkinPart var9
String var9
String var9
var9

Методы (25)

МодификаторыВозвратСигнатура
public InvalidSkinExceptionpublic InvalidSkinException(String var1, @Nullable String var2)
for for(int var2 = 0; var2 < 10; var2++)
private static String formatMessageprivate static String formatMessage(String var0, @Nullable String var1)
static CosmeticsModule getCosmeticsModule get()
public String getPartIdpublic String getPartId()
public String getPartTypepublic String getPartType()
public CosmeticRegistry getRegistryCosmeticRegistry getRegistry()
if if(var1 == null)
if if(var2 == null)
if if(var5 == null)
if if(var1 == null)
if if(var2 != null)
if if(var8 != null)
if if(var9 == null)
if if(var6 == null)
if if(!var3)
if if(var8 != null)
if if(var1 == null)
private boolean isValidAttachmentboolean isValidAttachment(@Nonnull Map<String, PlayerSkinPart> var1, String var2)
private boolean isValidAttachmentboolean isValidAttachment(@Nonnull Map<String, PlayerSkinPart> var1, @Nullable String var2, boolean var3)
private boolean isValidHaircutAttachmentboolean isValidHaircutAttachment(@Nullable String var1, @Nullable String var2)
private boolean isValidTextureboolean isValidTexture(@Nonnull PlayerSkinPart var1, String var2, String var3)
abstract super super(var1)
private void validateGeneratedSkinvoid validateGeneratedSkin(@Nonnull LoadAssetEvent var1)
public void validateSkinvoid validateSkin(@Nonnull com.hypixel.hytale.protocol.PlayerSkin var1)

Исходный код

Показать/скрыть
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;
      }
   }
}