Added support for mod map/schematic packs
This commit is contained in:
@@ -107,6 +107,7 @@ mod.requiresrestart = The game will now close to apply the mod changes.
|
|||||||
mod.reloadrequired = [scarlet]Reload Required
|
mod.reloadrequired = [scarlet]Reload Required
|
||||||
mod.import = Import Mod
|
mod.import = Import Mod
|
||||||
mod.import.github = Import GitHub Mod
|
mod.import.github = Import GitHub Mod
|
||||||
|
mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod.
|
||||||
mod.remove.confirm = This mod will be deleted.
|
mod.remove.confirm = This mod will be deleted.
|
||||||
mod.author = [LIGHT_GRAY]Author:[] {0}
|
mod.author = [LIGHT_GRAY]Author:[] {0}
|
||||||
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
|
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import io.anuke.arc.collection.IntIntMap.*;
|
|||||||
import io.anuke.arc.files.*;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.util.ArcAnnotate.*;
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
|
import io.anuke.mindustry.mod.Mods.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.blocks.storage.*;
|
import io.anuke.mindustry.world.blocks.storage.*;
|
||||||
@@ -16,8 +17,10 @@ public class Schematic implements Publishable, Comparable<Schematic>{
|
|||||||
public StringMap tags;
|
public StringMap tags;
|
||||||
public int width, height;
|
public int width, height;
|
||||||
public @Nullable FileHandle file;
|
public @Nullable FileHandle file;
|
||||||
|
/** Associated mod. If null, no mod is associated with this schematic. */
|
||||||
|
public @Nullable LoadedMod mod;
|
||||||
|
|
||||||
public Schematic(Array<Stile> tiles, StringMap tags, int width, int height){
|
public Schematic(Array<Stile> tiles, @NonNull StringMap tags, int width, int height){
|
||||||
this.tiles = tiles;
|
this.tiles = tiles;
|
||||||
this.tags = tags;
|
this.tags = tags;
|
||||||
this.width = width;
|
this.width = width;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import io.anuke.arc.graphics.*;
|
|||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.graphics.glutils.*;
|
import io.anuke.arc.graphics.glutils.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
import io.anuke.arc.util.io.Streams.*;
|
import io.anuke.arc.util.io.Streams.*;
|
||||||
import io.anuke.arc.util.serialization.*;
|
import io.anuke.arc.util.serialization.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
@@ -74,6 +75,14 @@ public class Schematics implements Loadable{
|
|||||||
|
|
||||||
platform.getWorkshopContent(Schematic.class).each(this::loadFile);
|
platform.getWorkshopContent(Schematic.class).each(this::loadFile);
|
||||||
|
|
||||||
|
//mod-specific schematics, cannot be removed
|
||||||
|
mods.listFiles("schematics", (mod, file) -> {
|
||||||
|
Schematic s = loadFile(file);
|
||||||
|
if(s != null){
|
||||||
|
s.mod = mod;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
all.sort();
|
all.sort();
|
||||||
|
|
||||||
if(shadowBuffer == null){
|
if(shadowBuffer == null){
|
||||||
@@ -102,8 +111,8 @@ public class Schematics implements Loadable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadFile(FileHandle file){
|
private @Nullable Schematic loadFile(FileHandle file){
|
||||||
if(!file.extension().equals(schematicExtension)) return;
|
if(!file.extension().equals(schematicExtension)) return null;
|
||||||
|
|
||||||
try{
|
try{
|
||||||
Schematic s = read(file);
|
Schematic s = read(file);
|
||||||
@@ -113,9 +122,12 @@ public class Schematics implements Loadable{
|
|||||||
if(!s.file.parent().equals(schematicDirectory)){
|
if(!s.file.parent().equals(schematicDirectory)){
|
||||||
s.tags.put("steamid", s.file.parent().name());
|
s.tags.put("steamid", s.file.parent().name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Array<Schematic> all(){
|
public Array<Schematic> all(){
|
||||||
|
|||||||
@@ -5,11 +5,13 @@ import io.anuke.arc.collection.*;
|
|||||||
import io.anuke.arc.files.*;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
|
import io.anuke.arc.util.ArcAnnotate.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.maps.filters.*;
|
import io.anuke.mindustry.maps.filters.*;
|
||||||
|
import io.anuke.mindustry.mod.Mods.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
@@ -35,6 +37,8 @@ public class Map implements Comparable<Map>, Publishable{
|
|||||||
public IntSet teams = new IntSet();
|
public IntSet teams = new IntSet();
|
||||||
/** Number of enemy spawns on this map.*/
|
/** Number of enemy spawns on this map.*/
|
||||||
public int spawns = 0;
|
public int spawns = 0;
|
||||||
|
/** Associated mod. If null, no mod is associated. */
|
||||||
|
public @Nullable LoadedMod mod;
|
||||||
|
|
||||||
public Map(FileHandle file, int width, int height, StringMap tags, boolean custom, int version, int build){
|
public Map(FileHandle file, int width, int height, StringMap tags, boolean custom, int version, int build){
|
||||||
this.custom = custom;
|
this.custom = custom;
|
||||||
|
|||||||
@@ -138,6 +138,17 @@ public class Maps{
|
|||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//mod
|
||||||
|
mods.listFiles("maps", (mod, file) -> {
|
||||||
|
try{
|
||||||
|
Map map = loadMap(file, false);
|
||||||
|
map.mod = mod;
|
||||||
|
}catch(Exception e){
|
||||||
|
Log.err("Failed to load mod map file '{0}'!", file);
|
||||||
|
Log.err(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reload(){
|
public void reload(){
|
||||||
|
|||||||
@@ -50,6 +50,18 @@ public class Mods implements Loadable{
|
|||||||
return modDirectory.child(load.name).child("config.json");
|
return modDirectory.child(load.name).child("config.json");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns a list of files per mod subdirectory. */
|
||||||
|
public void listFiles(String directory, Cons2<LoadedMod, FileHandle> cons){
|
||||||
|
for(LoadedMod mod : loaded){
|
||||||
|
FileHandle file = mod.root.child(directory);
|
||||||
|
if(file.exists()){
|
||||||
|
for(FileHandle child : file.list()){
|
||||||
|
cons.get(mod, child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** @return the loaded mod found by class, or null if not found. */
|
/** @return the loaded mod found by class, or null if not found. */
|
||||||
public @Nullable LoadedMod getMod(Class<? extends Mod> type){
|
public @Nullable LoadedMod getMod(Class<? extends Mod> type){
|
||||||
return loaded.find(l -> l.mod != null && l.mod.getClass() == type);
|
return loaded.find(l -> l.mod != null && l.mod.getClass() == type);
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ public class MapsDialog extends FloatingDialog{
|
|||||||
button.row();
|
button.row();
|
||||||
button.stack(new Image(map.safeTexture()).setScaling(Scaling.fit), new BorderImage(map.safeTexture()).setScaling(Scaling.fit)).size(mapsize - 20f);
|
button.stack(new Image(map.safeTexture()).setScaling(Scaling.fit), new BorderImage(map.safeTexture()).setScaling(Scaling.fit)).size(mapsize - 20f);
|
||||||
button.row();
|
button.row();
|
||||||
button.add(map.custom ? "$custom" : map.workshop ? "$workshop" : "$builtin").color(Color.gray).padTop(3);
|
button.add(map.custom ? "$custom" : map.workshop ? "$workshop" : map.mod != null ? "[lightgray]" + map.mod.meta.name : "$builtin").color(Color.gray).padTop(3);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,10 +99,14 @@ public class SchematicsDialog extends FloatingDialog{
|
|||||||
buttons.addImageButton(Icon.linkSmall, style, () -> platform.viewListing(s));
|
buttons.addImageButton(Icon.linkSmall, style, () -> platform.viewListing(s));
|
||||||
}else{
|
}else{
|
||||||
buttons.addImageButton(Icon.trash16Small, style, () -> {
|
buttons.addImageButton(Icon.trash16Small, style, () -> {
|
||||||
ui.showConfirm("$confirm", "$schematic.delete.confirm", () -> {
|
if(s.mod != null){
|
||||||
schematics.remove(s);
|
ui.showInfo(Core.bundle.format("mod.item.remove", s.mod.meta.name));
|
||||||
rebuildPane[0].run();
|
}else{
|
||||||
});
|
ui.showConfirm("$confirm", "$schematic.delete.confirm", () -> {
|
||||||
|
schematics.remove(s);
|
||||||
|
rebuildPane[0].run();
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user