use of com.loohp.interactivechat.libs.org.apache.commons.io.input.BOMInputStream in project InteractiveChat-DiscordSRV-Addon by LOOHP.
the class ModelManager method loadDirectory.
@Override
protected void loadDirectory(String namespace, ResourcePackFile root) {
if (!root.exists() || !root.isDirectory()) {
throw new IllegalArgumentException(root.getAbsolutePath() + " is not a directory.");
}
JSONParser parser = new JSONParser();
Map<String, BlockModel> models = new HashMap<>();
Collection<ResourcePackFile> files = root.listFilesRecursively(new String[] { "json" });
for (ResourcePackFile file : files) {
try {
String key = namespace + ":" + file.getRelativePathFrom(root);
key = key.substring(0, key.lastIndexOf("."));
InputStreamReader reader = new InputStreamReader(new BOMInputStream(file.getInputStream()), StandardCharsets.UTF_8);
JSONObject rootJson = (JSONObject) parser.parse(reader);
reader.close();
String parent = (String) rootJson.getOrDefault("parent", null);
boolean ambientocclusion = (boolean) rootJson.getOrDefault("ambientocclusion", true);
ModelGUILight guiLight = rootJson.containsKey("gui_light") ? ModelGUILight.fromKey((String) rootJson.get("gui_light")) : null;
Map<ModelDisplayPosition, ModelDisplay> display = new EnumMap<>(ModelDisplayPosition.class);
JSONObject displayJson = (JSONObject) rootJson.get("display");
if (displayJson != null) {
for (Object obj : displayJson.keySet()) {
String displayKey = obj.toString();
JSONArray rotationArray = (JSONArray) ((JSONObject) displayJson.get(displayKey)).get("rotation");
JSONArray translationArray = (JSONArray) ((JSONObject) displayJson.get(displayKey)).get("translation");
JSONArray scaleArray = (JSONArray) ((JSONObject) displayJson.get(displayKey)).get("scale");
Coordinates3D rotation;
if (rotationArray == null) {
rotation = new Coordinates3D(0, 0, 0);
} else {
rotation = new Coordinates3D(((Number) rotationArray.get(0)).doubleValue(), ((Number) rotationArray.get(1)).doubleValue(), ((Number) rotationArray.get(2)).doubleValue());
}
Coordinates3D translation;
if (translationArray == null) {
translation = new Coordinates3D(0, 0, 0);
} else {
translation = new Coordinates3D(((Number) translationArray.get(0)).doubleValue(), ((Number) translationArray.get(1)).doubleValue(), ((Number) translationArray.get(2)).doubleValue());
}
Coordinates3D scale;
if (scaleArray == null) {
scale = new Coordinates3D(1, 1, 1);
} else {
scale = new Coordinates3D(((Number) scaleArray.get(0)).doubleValue(), ((Number) scaleArray.get(1)).doubleValue(), ((Number) scaleArray.get(2)).doubleValue());
}
ModelDisplayPosition displayPos = ModelDisplayPosition.fromKey(displayKey);
display.put(displayPos, new ModelDisplay(displayPos, rotation, translation, scale));
}
}
Map<String, String> texture = new HashMap<>();
JSONObject textureJson = (JSONObject) rootJson.get("textures");
if (textureJson != null) {
for (Object obj : textureJson.keySet()) {
String textureKey = obj.toString();
texture.put(textureKey, textureJson.get(textureKey).toString());
}
}
List<ModelElement> elements = new ArrayList<>();
JSONArray elementsArray = (JSONArray) rootJson.get("elements");
if (elementsArray != null) {
for (Object obj : elementsArray) {
JSONObject elementJson = (JSONObject) obj;
JSONArray fromArray = (JSONArray) elementJson.get("from");
JSONArray toArray = (JSONArray) elementJson.get("to");
Coordinates3D from = new Coordinates3D(((Number) fromArray.get(0)).doubleValue(), ((Number) fromArray.get(1)).doubleValue(), ((Number) fromArray.get(2)).doubleValue());
Coordinates3D to = new Coordinates3D(((Number) toArray.get(0)).doubleValue(), ((Number) toArray.get(1)).doubleValue(), ((Number) toArray.get(2)).doubleValue());
ModelElementRotation rotation;
JSONObject rotationJson = (JSONObject) elementJson.get("rotation");
if (rotationJson == null) {
rotation = null;
} else {
Coordinates3D origin;
JSONArray originArray = (JSONArray) rotationJson.get("origin");
if (originArray == null) {
origin = new Coordinates3D(0, 0, 0);
} else {
origin = new Coordinates3D(((Number) originArray.get(0)).doubleValue(), ((Number) originArray.get(1)).doubleValue(), ((Number) originArray.get(2)).doubleValue());
}
ModelAxis axis = ModelAxis.valueOf(rotationJson.get("axis").toString().toUpperCase());
double angle = ((Number) rotationJson.get("angle")).doubleValue();
boolean rescale = (boolean) rotationJson.getOrDefault("rescale", false);
rotation = new ModelElementRotation(origin, axis, angle, rescale);
}
boolean shade = (boolean) elementJson.getOrDefault("shade", true);
Map<ModelFaceSide, ModelFace> face = new EnumMap<>(ModelFaceSide.class);
JSONObject facesJson = (JSONObject) elementJson.get("faces");
if (facesJson != null) {
for (Object obj1 : facesJson.keySet()) {
String faceKey = obj1.toString();
ModelFaceSide side = ModelFaceSide.fromKey(faceKey);
JSONObject faceJson = (JSONObject) facesJson.get(faceKey);
TextureUV uv;
JSONArray uvArray = (JSONArray) faceJson.get("uv");
if (uvArray == null) {
uv = null;
} else {
uv = new TextureUV(((Number) uvArray.get(0)).doubleValue(), ((Number) uvArray.get(1)).doubleValue(), ((Number) uvArray.get(2)).doubleValue(), ((Number) uvArray.get(3)).doubleValue());
}
String faceTexture = (String) faceJson.get("texture");
Object cullfaceObj = faceJson.get("cullface");
ModelFaceSide cullface = null;
if (cullfaceObj != null && cullfaceObj instanceof String) {
cullface = ModelFaceSide.fromKey((String) cullfaceObj);
}
if (cullface == null) {
cullface = side;
}
int faceRotation = ((Number) faceJson.getOrDefault("rotation", 0)).intValue();
int faceTintindex = ((Number) faceJson.getOrDefault("tintindex", -1)).intValue();
face.put(side, new ModelFace(side, uv, faceTexture, cullface, faceRotation, faceTintindex));
}
}
elements.add(new ModelElement(from, to, rotation, shade, face));
}
}
List<ModelOverride> overrides = new ArrayList<>();
JSONArray overridesArray = (JSONArray) rootJson.get("overrides");
if (overridesArray != null) {
for (Object obj : overridesArray) {
JSONObject overrideJson = (JSONObject) obj;
JSONObject predicateJson = (JSONObject) overrideJson.get("predicate");
Map<ModelOverrideType, Float> predicates = new EnumMap<>(ModelOverrideType.class);
for (Object obj1 : predicateJson.keySet()) {
String predicateTypeKey = obj1.toString();
ModelOverrideType type = ModelOverrideType.fromKey(predicateTypeKey);
Object value = predicateJson.get(predicateTypeKey);
predicates.put(type, ((Number) value).floatValue());
}
String model = (String) overrideJson.get("model");
overrides.add(new ModelOverride(predicates, model));
}
}
Collections.reverse(overrides);
models.put(key, new BlockModel(this, parent, ambientocclusion, guiLight, display, texture, elements, overrides));
} catch (Exception e) {
new ResourceLoadingException("Unable to load block model " + file.getAbsolutePath(), e).printStackTrace();
}
}
this.models.putAll(models);
}
use of com.loohp.interactivechat.libs.org.apache.commons.io.input.BOMInputStream in project InteractiveChat-DiscordSRV-Addon by LOOHP.
the class TextureManager method loadDirectory.
@SuppressWarnings("unchecked")
@Override
protected void loadDirectory(String namespace, ResourcePackFile root) {
if (!root.exists() || !root.isDirectory()) {
throw new IllegalArgumentException(root.getAbsolutePath() + " is not a directory.");
}
JSONParser parser = new JSONParser();
Map<String, TextureResource> textures = new HashMap<>();
Collection<ResourcePackFile> files = root.listFilesRecursively();
for (ResourcePackFile file : files) {
try {
String key = namespace + ":" + file.getRelativePathFrom(root);
String extension = "";
if (key.lastIndexOf(".") >= 0) {
extension = key.substring(key.lastIndexOf(".") + 1);
key = key.substring(0, key.lastIndexOf("."));
}
if (extension.equalsIgnoreCase("png")) {
textures.put(key, new TextureResource(this, key, file, true));
} else if (extension.equalsIgnoreCase("mcmeta")) {
InputStreamReader reader = new InputStreamReader(new BOMInputStream(file.getInputStream()), StandardCharsets.UTF_8);
JSONObject rootJson = (JSONObject) parser.parse(reader);
reader.close();
TextureAnimation animation = null;
if (rootJson.containsKey("animation")) {
JSONObject animationJson = (JSONObject) rootJson.get("animation");
boolean interpolate = (boolean) animationJson.getOrDefault("interpolate", false);
int width = ((Number) animationJson.getOrDefault("width", -1)).intValue();
int height = ((Number) animationJson.getOrDefault("height", -1)).intValue();
int frametime = ((Number) animationJson.getOrDefault("frametime", -1)).intValue();
JSONArray framesArray = ((JSONArray) animationJson.getOrDefault("frames", new JSONArray()));
List<TextureAnimationFrames> frames = new ArrayList<>();
for (Object obj : framesArray) {
if (obj instanceof Number) {
frames.add(new TextureAnimationFrames(((Number) obj).intValue(), frametime));
} else if (obj instanceof JSONObject) {
JSONObject frameJson = (JSONObject) obj;
frames.add(new TextureAnimationFrames(((Number) frameJson.get("index")).intValue(), ((Number) frameJson.get("time")).intValue()));
}
}
animation = new TextureAnimation(interpolate, width, height, frametime, frames);
}
TextureProperties properties = null;
if (rootJson.containsKey("texture")) {
JSONObject propertiesJson = (JSONObject) rootJson.get("texture");
boolean blur = (boolean) propertiesJson.getOrDefault("blur", false);
boolean clamp = (boolean) propertiesJson.getOrDefault("clamp", false);
int[] mipmaps = ((JSONArray) propertiesJson.getOrDefault("mipmaps", new JSONArray())).stream().mapToInt(each -> ((Number) each).intValue()).toArray();
properties = new TextureProperties(blur, clamp, mipmaps);
}
textures.put(key + "." + extension, new TextureMeta(this, key + "." + extension, file, animation, properties));
} else {
textures.put(key + "." + extension, new TextureResource(this, key, file));
}
} catch (Exception e) {
new ResourceLoadingException("Unable to load block model " + file.getAbsolutePath(), e).printStackTrace();
}
}
this.textures.putAll(textures);
}
use of com.loohp.interactivechat.libs.org.apache.commons.io.input.BOMInputStream in project InteractiveChat-DiscordSRV-Addon by LOOHP.
the class FontManager method loadDirectory.
@Override
protected void loadDirectory(String namespace, ResourcePackFile root) {
if (!root.exists() || !root.isDirectory()) {
throw new IllegalArgumentException(root.getAbsolutePath() + " is not a directory.");
}
Map<String, ResourcePackFile> fileList = files.get(namespace);
if (fileList == null) {
files.put(namespace, fileList = new HashMap<>());
}
JSONParser parser = new JSONParser();
Map<String, FontProvider> fonts = new HashMap<>(this.fonts);
Collection<ResourcePackFile> files = root.listFilesRecursively();
for (ResourcePackFile file : files) {
fileList.put(file.getName(), file);
}
for (ResourcePackFile file : files) {
if (file.getName().endsWith(".json")) {
try {
String key = namespace + ":" + file.getName();
key = key.substring(0, key.lastIndexOf("."));
InputStreamReader reader = new InputStreamReader(new BOMInputStream(file.getInputStream()), StandardCharsets.UTF_8);
JSONObject rootJson = (JSONObject) parser.parse(reader);
reader.close();
List<MinecraftFont> providedFonts = new ArrayList<>();
int index = -1;
for (Object obj : (JSONArray) rootJson.get("providers")) {
index++;
JSONObject fontJson = (JSONObject) obj;
try {
switch(fontJson.get("type").toString()) {
case "bitmap":
String resourceLocation = fontJson.get("file").toString();
int height = ((Number) fontJson.getOrDefault("height", 8)).intValue();
int ascent = ((Number) fontJson.get("ascent")).intValue();
List<String> chars = (List<String>) ((JSONArray) fontJson.get("chars")).stream().map(each -> each.toString()).collect(Collectors.toList());
providedFonts.add(new BitmapFont(manager, null, resourceLocation, height, ascent, chars));
break;
case "legacy_unicode":
String template = fontJson.get("template").toString();
DataInputStream sizesInput = new DataInputStream(new BufferedInputStream(getFontResource(fontJson.get("sizes").toString()).getFile().getInputStream()));
Int2ObjectOpenHashMap<GlyphSize> sizes = new Int2ObjectOpenHashMap<>();
for (int i = 0; ; i++) {
try {
byte b = sizesInput.readByte();
byte start = (byte) ((b >> 4) & 15);
byte end = (byte) (b & 15);
sizes.put(i, new GlyphSize(start, end));
} catch (EOFException e) {
break;
}
}
sizesInput.close();
providedFonts.add(new LegacyUnicodeFont(manager, null, sizes, template));
break;
case "ttf":
resourceLocation = fontJson.get("file").toString();
JSONArray shiftArray = (JSONArray) fontJson.get("shift");
float leftShift = ((Number) shiftArray.get(0)).floatValue();
float downShift = ((Number) shiftArray.get(1)).floatValue();
AffineTransform shift = AffineTransform.getTranslateInstance(-leftShift, downShift);
float size = ((Number) fontJson.get("size")).floatValue();
float oversample = ((Number) fontJson.get("oversample")).floatValue();
String skip = fontJson.getOrDefault("skip", "").toString();
providedFonts.add(new TrueTypeFont(manager, null, resourceLocation, shift, size, oversample, skip));
break;
}
} catch (Exception e) {
new ResourceLoadingException("Unable to load font provider " + index + " in " + file.getAbsolutePath(), e).printStackTrace();
}
}
FontProvider existingProvider = fonts.get(key);
if (existingProvider == null) {
providedFonts.add(new BackingEmptyFont(manager, null));
FontProvider provider = new FontProvider(key, providedFonts);
for (MinecraftFont mcFont : provider.getProviders()) {
mcFont.setProvider(provider);
}
fonts.put(key, provider);
} else {
for (MinecraftFont mcFont : providedFonts) {
mcFont.setProvider(existingProvider);
}
existingProvider.prependProviders(providedFonts);
}
} catch (Exception e) {
new ResourceLoadingException("Unable to load font " + file.getAbsolutePath(), e).printStackTrace();
}
}
}
this.fonts.clear();
this.fonts.putAll(fonts);
}
use of com.loohp.interactivechat.libs.org.apache.commons.io.input.BOMInputStream in project InteractiveChat-DiscordSRV-Addon by LOOHP.
the class LanguageManager method loadDirectory.
@Override
protected void loadDirectory(String namespace, ResourcePackFile root) {
if (!root.exists() || !root.isDirectory()) {
throw new IllegalArgumentException(root.getAbsolutePath() + " is not a directory.");
}
JSONParser parser = new JSONParser();
Map<String, Map<String, String>> translations = new HashMap<>();
for (ResourcePackFile file : root.listFilesRecursively()) {
String name = file.getName();
if (name.endsWith(".json")) {
try {
InputStreamReader reader = new InputStreamReader(new BOMInputStream(file.getInputStream()), StandardCharsets.UTF_8);
JSONObject json = (JSONObject) parser.parse(reader);
reader.close();
Map<String, String> mapping = new HashMap<>();
for (Object obj : json.keySet()) {
try {
String key = (String) obj;
mapping.put(key, (String) json.get(key));
} catch (Exception e) {
}
}
translations.put(file.getName().substring(0, file.getName().lastIndexOf(".")), mapping);
} catch (Exception e) {
new ResourceLoadingException("Unable to load language " + file.getAbsolutePath(), e).printStackTrace();
}
} else if (name.endsWith(".lang")) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new BOMInputStream(file.getInputStream()), StandardCharsets.UTF_8))) {
Map<String, String> mapping = new HashMap<>();
String line;
while ((line = reader.readLine()) != null) {
int separator = line.indexOf("=");
if (separator >= 0) {
mapping.put(line.substring(0, separator), line.substring(separator + 1));
}
}
translations.put(file.getName().substring(0, file.getName().lastIndexOf(".")), mapping);
} catch (Exception e) {
new ResourceLoadingException("Unable to load language " + file.getAbsolutePath(), e).printStackTrace();
}
}
}
for (Entry<String, Map<String, String>> entry : translations.entrySet()) {
String key = entry.getKey();
Map<String, String> mapping = this.translations.get(key);
if (mapping == null) {
this.translations.put(key, entry.getValue());
} else {
mapping.putAll(entry.getValue());
}
}
}
use of com.loohp.interactivechat.libs.org.apache.commons.io.input.BOMInputStream in project InteractiveChat-DiscordSRV-Addon by LOOHP.
the class ResourceManager method loadResources.
public synchronized ResourcePackInfo loadResources(File resourcePackFile) {
String resourcePackName = resourcePackFile.getName();
if (!resourcePackFile.exists()) {
new IllegalArgumentException(resourcePackFile.getAbsolutePath() + " is not a directory nor is a zip file.").printStackTrace();
ResourcePackInfo info = new ResourcePackInfo(this, null, resourcePackName, "Resource Pack is not a directory nor a zip file.");
resourcePackInfo.add(0, info);
return info;
}
ResourcePackFile resourcePack;
if (resourcePackFile.isDirectory()) {
resourcePack = new ResourcePackSystemFile(resourcePackFile);
} else {
try {
resourcePack = new ResourcePackZipEntryFile(resourcePackFile);
} catch (IOException e) {
new IllegalArgumentException(resourcePackFile.getAbsolutePath() + " is an invalid zip file.").printStackTrace();
ResourcePackInfo info = new ResourcePackInfo(this, null, resourcePackName, "Resource Pack is an invalid zip file.");
resourcePackInfo.add(0, info);
return info;
}
}
ResourcePackFile packMcmeta = resourcePack.getChild("pack.mcmeta");
if (!packMcmeta.exists()) {
new ResourceLoadingException(resourcePackName + " does not have a pack.mcmeta").printStackTrace();
ResourcePackInfo info = new ResourcePackInfo(this, resourcePack, resourcePackName, "pack.mcmeta not found");
resourcePackInfo.add(0, info);
return info;
}
JSONObject json;
try (InputStreamReader reader = new InputStreamReader(new BOMInputStream(packMcmeta.getInputStream()), StandardCharsets.UTF_8)) {
json = (JSONObject) new JSONParser().parse(reader);
} catch (Throwable e) {
new ResourceLoadingException("Unable to read pack.mcmeta for " + resourcePackName, e).printStackTrace();
ResourcePackInfo info = new ResourcePackInfo(this, resourcePack, resourcePackName, "Unable to read pack.mcmeta");
resourcePackInfo.add(0, info);
return info;
}
int format;
Component description = null;
try {
JSONObject packJson = (JSONObject) json.get("pack");
format = ((Number) packJson.get("pack_format")).intValue();
String rawDescription = packJson.get("description").toString();
if (JsonUtils.isValid(rawDescription)) {
try {
description = InteractiveChatComponentSerializer.gson().deserialize(rawDescription);
} catch (Exception e) {
description = null;
}
}
if (description == null) {
description = LegacyComponentSerializer.legacySection().deserialize(rawDescription);
}
if (description.color() == null) {
description = description.color(NamedTextColor.GRAY);
}
} catch (Exception e) {
new ResourceLoadingException("Invalid pack.mcmeta for " + resourcePackName, e).printStackTrace();
ResourcePackInfo info = new ResourcePackInfo(this, resourcePack, resourcePackName, "Invalid pack.mcmeta");
resourcePackInfo.add(0, info);
return info;
}
BufferedImage icon = null;
ResourcePackFile packIcon = resourcePack.getChild("pack.png");
if (packIcon.exists()) {
try {
icon = ImageIO.read(packIcon.getInputStream());
} catch (Exception ignore) {
}
}
ResourcePackFile assetsFolder = resourcePack.getChild("assets");
try {
loadAssets(assetsFolder);
} catch (Exception e) {
new ResourceLoadingException("Unable to load assets for " + resourcePackName, e).printStackTrace();
ResourcePackInfo info = new ResourcePackInfo(this, resourcePack, resourcePackName, false, "Unable to load assets", format, description, icon);
resourcePackInfo.add(0, info);
return info;
}
ResourcePackInfo info = new ResourcePackInfo(this, resourcePack, resourcePackName, true, null, format, description, icon);
resourcePackInfo.add(0, info);
return info;
}
Aggregations