package com.hypixel.hytale.server.core.asset.common;
import com.hypixel.hytale.codec.schema.SchemaContext;
import com.hypixel.hytale.codec.schema.config.Schema;
import com.hypixel.hytale.codec.schema.config.StringSchema;
import com.hypixel.hytale.codec.validation.ValidationResults;
import com.hypixel.hytale.codec.validation.Validator;
import com.hypixel.hytale.codec.validation.validator.ArrayValidator;
import com.hypixel.hytale.common.util.PatternUtil;
import java.util.Arrays;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class CommonAssetValidator implements Validator<String> {
public static final CommonAssetValidator TEXTURE_ITEM = new CommonAssetValidator("png", new String[]{"Blocks", "BlockTextures", "Items", "NPC", "Resources", "VFX"});
public static final CommonAssetValidator TEXTURE_CHARACTER = new CommonAssetValidator("png", new String[]{"Characters", "NPC", "Items", "VFX"});
public static final CommonAssetValidator TEXTURE_CHARACTER_ATTACHMENT = new CommonAssetValidator("png", new String[]{"Characters", "NPC", "Items", "Cosmetics", "Items", "NPC", "Resources"});
public static final CommonAssetValidator TEXTURE_TRAIL = new CommonAssetValidator("png", new String[]{"Trails"});
public static final CommonAssetValidator TEXTURE_SKY = new CommonAssetValidator("png", new String[]{"Sky"});
public static final CommonAssetValidator TEXTURE_PARTICLES = new CommonAssetValidator("png", new String[]{"Particles"});
public static final CommonAssetValidator TEXTURE_ITEM_QUALITY = new CommonAssetValidator("png", true, new String[]{"UI/ItemQualities"});
public static final CommonAssetValidator ICON_RESOURCE = new CommonAssetValidator("png", new String[]{"Icons/ResourceTypes"});
public static final CommonAssetValidator ICON_ITEM = new CommonAssetValidator("png", new String[]{"Icons/ItemsGenerated", "Icons/Items"});
public static final CommonAssetValidator ICON_ITEM_CATEGORIES = new CommonAssetValidator("png", new String[]{"Icons/ItemCategories"});
public static final CommonAssetValidator ICON_CRAFTING = new CommonAssetValidator("png", new String[]{"Icons/CraftingCategories"});
public static final CommonAssetValidator ICON_ENTITY_STAT = new CommonAssetValidator("png", new String[]{"Icons/EntityStats"});
public static final CommonAssetValidator ICON_MODEL = new CommonAssetValidator("png", new String[]{"Icons/ModelsGenerated", "Icons/Models"});
public static final CommonAssetValidator UI_RETICLE_PART = new CommonAssetValidator("png", new String[]{"UI/Reticles"});
public static final ArrayValidator<String> UI_RETICLE_PARTS_ARRAY;
public static final CommonAssetValidator UI_SCREEN_EFFECT;
public static final CommonAssetValidator UI_CRAFTING_DIAGRAM;
public static final CommonAssetValidator MODEL_ITEM;
public static final CommonAssetValidator MODEL_CHARACTER;
public static final CommonAssetValidator MODEL_CHARACTER_ATTACHMENT;
public static final CommonAssetValidator PREFAB_LIST;
public static final CommonAssetValidator BLOCK_LIST;
public static final CommonAssetValidator ANIMATION_ITEM_CHARACTER;
public static final CommonAssetValidator ANIMATION_ITEM_BLOCK;
public static final CommonAssetValidator ANIMATION_CHARACTER;
public static final CommonAssetValidator MUSIC;
public static final CommonAssetValidator SOUNDS;
@Nullable
private final String[] requiredRoots;
@Nullable
private final String requiredExtension;
private final boolean isUIAsset;
public CommonAssetValidator(String requiredExtension, boolean isUIAsset, @Nullable String... requiredRoots) {
if (requiredRoots != null) {
for(int i = 0; i < requiredRoots.length; ++i) {
String req = requiredRoots[i];
if (!req.endsWith("/")) {
requiredRoots[i] = req + "/";
}
}
}
this.requiredRoots = requiredRoots;
this.requiredExtension = requiredExtension;
this.isUIAsset = isUIAsset;
}
public CommonAssetValidator(String requiredExtension, String... requiredRoots) {
this(requiredExtension, false, requiredRoots);
}
public CommonAssetValidator() {
this.requiredRoots = null;
this.requiredExtension = null;
this.isUIAsset = true;
}
public void accept(@Nullable String asset, @Nonnull ValidationResults results) {
if (asset != null) {
if (this.requiredRoots != null) {
boolean valid = false;
for(String root : this.requiredRoots) {
if (asset.startsWith(root)) {
valid = true;
break;
}
}
if (!valid) {
results.fail("Common Asset '" + asset + "' must be within the root: " + Arrays.toString(this.requiredRoots));
}
}
if (this.requiredExtension != null && !asset.endsWith(this.requiredExtension)) {
results.fail("Common Asset '" + asset + "' must have the extension " + this.requiredExtension);
}
asset = PatternUtil.replaceBackslashWithForwardSlash(asset);
if (!CommonAssetRegistry.hasCommonAsset(asset)) {
if (this.isUIAsset && asset.endsWith(".png")) {
String scaled2XVersionFilename = asset.substring(0, asset.lastIndexOf(".png")) + "@2x.png";
if (!CommonAssetRegistry.hasCommonAsset(scaled2XVersionFilename)) {
results.fail("Common Asset '" + asset + "' doesn't exist!");
}
} else {
results.fail("Common Asset '" + asset + "' doesn't exist!");
}
}
}
}
public void updateSchema(SchemaContext context, @Nonnull Schema target) {
((StringSchema)target).setHytaleCommonAsset(new StringSchema.CommonAsset(this.requiredExtension, this.isUIAsset, this.requiredRoots));
}
static {
UI_RETICLE_PARTS_ARRAY = new ArrayValidator<String>(UI_RETICLE_PART);
UI_SCREEN_EFFECT = new CommonAssetValidator("png", new String[]{"ScreenEffects"});
UI_CRAFTING_DIAGRAM = new CommonAssetValidator("svg", new String[]{"CraftingDiagrams"});
MODEL_ITEM = new CommonAssetValidator("blockymodel", new String[]{"Blocks", "Items", "Resources", "NPC", "VFX", "Consumable"});
MODEL_CHARACTER = new CommonAssetValidator("blockymodel", new String[]{"Characters", "NPC", "Items", "VFX"});
MODEL_CHARACTER_ATTACHMENT = new CommonAssetValidator("blockymodel", new String[]{"Characters", "NPC", "Items", "Cosmetics", "Items", "NPC", "Resources"});
PREFAB_LIST = new CommonAssetValidator("json", new String[]{"PrefabList"});
BLOCK_LIST = new CommonAssetValidator("json", new String[]{"BlockTypeList"});
ANIMATION_ITEM_CHARACTER = new CommonAssetValidator("blockyanim", new String[]{"Characters", "NPC"});
ANIMATION_ITEM_BLOCK = new CommonAssetValidator("blockyanim", new String[]{"Blocks", "Items", "Resources", "NPC", "VFX", "Consumable"});
ANIMATION_CHARACTER = new CommonAssetValidator("blockyanim", new String[]{"Characters", "NPC", "Equipment", "VFX", "Items"});
MUSIC = new CommonAssetValidator("ogg", new String[]{"Music"});
SOUNDS = new CommonAssetValidator("ogg", new String[]{"Sounds"});
}
}