package com.thebrokenrail.gestus.emote; import com.thebrokenrail.gestus.emote.exception.EmoteSyntaxException; import net.minecraft.util.math.EulerAngle; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Emote { public final EmoteFrame[] frames; private static int getArmMode(EmotePart part) { if (part == EmotePart.LEFT_ARM || part == EmotePart.RIGHT_ARM) { return 1; } else if (part == EmotePart.MAIN_ARM || part == EmotePart.OFF_ARM) { return 2; } else { return 0; } } public Emote(String[] lines) throws EmoteSyntaxException { List list = new ArrayList<>(); EmotePart[] parts = EmotePart.values(); for (int lineNum = 0; lineNum < lines.length; lineNum++) { String line = lines[lineNum].trim(); if (line.equals("maintain") && list.size() > 0) { list.add(list.get(list.size() - 1)); } else if (!line.startsWith("#")) { int armMode = 0; Map map = new HashMap<>(); String[] lineParts = line.split(" "); for (int i = 0; i < lineParts.length; i++) { String linePart = lineParts[i]; boolean found = false; EmotePart selectedPart = null; for (EmotePart part : parts) { if (linePart.equals(part.getName())) { selectedPart = part; found = true; break; } } if (!found) { throw new EmoteSyntaxException(lineNum, "Invalid Emote Part: " + linePart); } else if (map.containsKey(selectedPart)) { throw new EmoteSyntaxException(lineNum, "Duplicate Emote Part: " + linePart); } else if (armMode == 0) { armMode = getArmMode(selectedPart); } else if (armMode > 0) { int newMode = getArmMode(selectedPart); if (newMode != 0 && newMode != armMode) { throw new EmoteSyntaxException(lineNum, "Conflicting Arm Modes"); } } try { String yawStr = lineParts[++i]; String pitchStr = lineParts[++i]; String rollStr = lineParts[++i]; float yaw = Float.parseFloat(yawStr); float pitch = -Float.parseFloat(pitchStr); float roll = Float.parseFloat(rollStr); map.put(selectedPart, new EulerAngle(pitch, yaw, roll)); } catch (ArrayIndexOutOfBoundsException | NumberFormatException e) { throw new EmoteSyntaxException(lineNum, "No Rotation Specified: " + selectedPart.getName()); } } list.add(new EmoteFrame(map)); } } frames = list.toArray(new EmoteFrame[0]); } }