repeating_mod/remappedSrc/themixray/repeating/mod/RecordState.java
2024-04-22 18:17:31 +03:00

170 lines
4.7 KiB
Java

package themixray.repeating.mod;
import com.google.common.collect.Lists;
import net.minecraft.util.math.Vec3d;
import themixray.repeating.mod.event.RecordEvent;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class RecordState {
public static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM.dd.yyyy HH:mm:ss");
public static SimpleDateFormat FILE_DATE_FORMAT = new SimpleDateFormat("MM-dd-yyyy_HH-mm-ss");
private final File file;
private String name;
private Date date;
private String author;
private List<RecordEvent> events;
private Vec3d start_record_pos;
private Vec3d finish_record_pos;
public RecordState(File file,
String name,
Date date,
String author,
List<RecordEvent> events,
Vec3d start_record_pos,
Vec3d finish_record_pos) {
this.file = file;
this.name = name;
this.date = date;
this.author = author;
this.events = events;
this.start_record_pos = start_record_pos;
this.finish_record_pos = finish_record_pos;
}
public File getFile() {
return file;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public Date getDate() {
return date;
}
public List<RecordEvent> getEvents() {
return events;
}
public Vec3d getFinishRecordPos() {
return finish_record_pos;
}
public Vec3d getStartRecordPos() {
return start_record_pos;
}
public void setAuthor(String author) {
this.author = author;
}
public void setDate(Date date) {
this.date = date;
}
public void setName(String name) {
this.name = name;
}
public void setEvents(List<RecordEvent> events) {
this.events = events;
}
public void setFinishRecordPos(Vec3d finish_record_pos) {
this.finish_record_pos = finish_record_pos;
}
public void setStartRecordPos(Vec3d start_record_pos) {
this.start_record_pos = start_record_pos;
}
public void addEvent(RecordEvent event) {
events.add(event);
}
public RecordEvent getLastEvent(String type) {
for (RecordEvent r: Lists.reverse(new ArrayList<>(events))) {
if (r.getType().equals(type)) {
return r;
}
}
return null;
}
public void save() throws IOException {
StringBuilder text = new StringBuilder();
text.append(name).append("\n")
.append(DATE_FORMAT.format(date)).append("\n")
.append(author).append("\n");
text.append(start_record_pos.getX()).append("n")
.append(start_record_pos.getY()).append("n")
.append(start_record_pos.getZ()).append("x")
.append(finish_record_pos.getX()).append("n")
.append(finish_record_pos.getY()).append("n")
.append(finish_record_pos.getZ());
for (int i = 0; i < events.size(); i++) {
text.append("\n");
text.append(events.get(i).serialize());
}
Files.write(file.toPath(), text.toString().getBytes());
}
public static RecordState load(File file) throws Exception {
String text = Files.readString(file.toPath());
List<String> lines = List.of(text.split("\n"));
List<String> signature = lines.subList(0,4);
String name = signature.get(0);
Date date = DATE_FORMAT.parse(signature.get(1));
String author = signature.get(2);
String record_pos = signature.get(3);
String[] lss0 = record_pos.split("x");
String[] lss1 = lss0[0].split("n");
String[] lss2 = lss0[1].split("n");
Vec3d start_record_pos = new Vec3d(
Float.parseFloat(lss1[0]),
Float.parseFloat(lss1[1]),
Float.parseFloat(lss1[2]));
Vec3d finish_record_pos = new Vec3d(
Float.parseFloat(lss2[0]),
Float.parseFloat(lss2[1]),
Float.parseFloat(lss2[2]));
List<String> event_lines = lines.subList(4,lines.size());
List<RecordEvent> events = event_lines.stream().map(RecordEvent::deserialize).toList();
return new RecordState(file, name, date, author, events, start_record_pos, finish_record_pos);
}
public void remove() {
file.delete();
Main.me.record_list.removeRecord(this);
Main.me.record_list.getWidget().removeWidget(this);
}
}