This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
Gestus/src/main/java/com/thebrokenrail/gestus/emote/Emote.java

89 lines
3.2 KiB
Java

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<EmoteFrame> 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<EmotePart, EulerAngle> 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]);
}
}