Save file drop support for desktop

This commit is contained in:
Anuken
2026-02-04 12:36:40 -05:00
parent 5a9e8cbcac
commit 4497e34bbb
6 changed files with 73 additions and 8 deletions

View File

@@ -9,19 +9,25 @@ import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.ai.*;
import mindustry.audio.*;
import mindustry.core.*;
import mindustry.ctype.*;
import mindustry.game.EventType.*;
import mindustry.game.*;
import mindustry.game.Saves.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.io.*;
import mindustry.maps.*;
import mindustry.mod.*;
import mindustry.net.*;
import mindustry.ui.*;
import java.io.*;
import java.util.zip.*;
import static arc.Core.*;
import static mindustry.Vars.*;
@@ -303,4 +309,34 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
super.pause();
}
}
@Override
public void fileDropped(Fi file){
if(!OS.isIos){
if(file.extension().equalsIgnoreCase(saveExtension)){ //open save
try{
if(SaveIO.isSaveValid(file)){
SaveMeta meta = SaveIO.getMeta(new DataInputStream(new InflaterInputStream(file.read(Streams.defaultBufferSize))));
if(meta.tags.containsKey("name")){
//is map
if(!ui.editor.isShown()){
ui.editor.show();
}
ui.editor.beginEditMap(file);
}else if(meta.rules.sector == null){ //don't allow importing campaign saves, they are broken
SaveSlot slot = control.saves.importSave(file);
ui.load.runLoadSave(slot);
}else{
ui.showErrorMessage("@save.nocampaign");
}
}else{
ui.showErrorMessage("@save.import.invalid");
}
}catch(Throwable e){
ui.showException("@save.import.fail", e);
}
}
}
}
}

View File

@@ -43,6 +43,7 @@ import mindustry.type.*;
import mindustry.type.ammo.*;
import mindustry.type.weather.*;
import mindustry.world.*;
import mindustry.world.blocks.*;
import mindustry.world.blocks.units.*;
import mindustry.world.blocks.units.UnitFactory.*;
import mindustry.world.consumers.*;
@@ -89,6 +90,14 @@ public class ContentParser{
if(Attribute.exists(attr)) return Attribute.get(attr);
return Attribute.add(attr);
});
put(Attributes.class, (type, data) -> {
Attributes attr = new Attributes();
for(var child : data){
Attribute value = Attribute.exists(child.name) ? Attribute.get(child.name) : Attribute.add(child.name);
attr.set(value, child.asFloat());
}
return attr;
});
put(BuildVisibility.class, (type, data) -> field(BuildVisibility.class, data));
put(Schematic.class, (type, data) -> {
Object result = fieldOpt(Loadouts.class, data);

View File

@@ -77,6 +77,13 @@ public class DataPatcher{
contentLoader = Vars.content.copy();
patches.clear();
Attribute[] oldAttributes = Attribute.all.clone();
var oldAttributeMap = Attribute.map.copy();
reset(() -> {
Attribute.all = oldAttributes;
Attribute.map = oldAttributeMap;
});
for(String patch : patchArray){
PatchSet set = new PatchSet(patch, new JsonValue("error"));
patches.add(set);