diff options
Diffstat (limited to 'src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java')
-rw-r--r-- | src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java new file mode 100644 index 0000000000..3300f98b92 --- /dev/null +++ b/src/main/java/bloodasp/galacticgreg/schematics/SpaceSchematicHandler.java @@ -0,0 +1,182 @@ +package bloodasp.galacticgreg.schematics; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; + +import org.apache.commons.io.FileUtils; + +import bloodasp.galacticgreg.GalacticGreg; + +/** + * Class for XML Structure files. You only should edit/use this file/class if you want to add/fix stuff with + * GalacticGreg itself, and never if you're a mod developer and want to add support for GGreg to your mod. However, feel + * free to copy this code to your own mod to implement structures. If you have questions, find me on github and ask + */ +public class SpaceSchematicHandler { + + File _mConfigFolderName; + File _mSchematicsFolderName; + private List<SpaceSchematic> _mSpaceSchematics; + + @SuppressWarnings("ResultOfMethodCallIgnored") + public SpaceSchematicHandler(File pConfigFolder) { + _mConfigFolderName = new File(String.format("%s/%s", pConfigFolder.toString(), GalacticGreg.NICE_MODID)); + _mSchematicsFolderName = new File(String.format("%s/schematics", _mConfigFolderName)); + + _mSpaceSchematics = new ArrayList<>(); + + if (!_mSchematicsFolderName.exists()) _mSchematicsFolderName.mkdirs(); + } + + /** + * Get a random schematic to be placed. + * + * @return A schematic that can be spawned in space + */ + public SpaceSchematic getRandomSpaceSchematic() { + int tRandomChance = GalacticGreg.GalacticRandom.nextInt(100); + List<Integer> tRandomIDs = new ArrayList<>(); + SpaceSchematic tChoosenSchematic = null; + + if (_mSpaceSchematics == null) return null; + + if (_mSpaceSchematics.size() == 0) return null; + + if (_mSpaceSchematics.size() == 1) { + tChoosenSchematic = _mSpaceSchematics.get(0); + if (tChoosenSchematic.getRarity() < tRandomChance) tChoosenSchematic = null; + } else { + for (int i = 0; i < _mSpaceSchematics.size(); i++) { + if (_mSpaceSchematics.get(i) + .getRarity() >= tRandomChance) tRandomIDs.add(i); + } + } + + if (tRandomIDs.size() > 0) { + int tRnd = GalacticGreg.GalacticRandom.nextInt(tRandomIDs.size()); + tChoosenSchematic = _mSpaceSchematics.get(tRandomIDs.get(tRnd)); + } + + return tChoosenSchematic; + } + + /** + * Try to reload the schematics. Will not change the list of currently loaded schematics if any errors are detected, + * except if you force it to do so + * + * @return + */ + public boolean reloadSchematics(boolean pForceReload) { + try { + Collection<File> structureFiles = FileUtils + .listFiles(_mSchematicsFolderName, new String[] { "xml" }, false); + List<SpaceSchematic> tNewSpaceSchematics = new ArrayList<>(); + int tErrorsFound = 0; + + if (structureFiles.isEmpty()) return true; + + for (File tSchematic : structureFiles) { + try { + SpaceSchematic tSchematicObj = LoadSpaceSchematic(tSchematic); + if (tSchematicObj != null) tNewSpaceSchematics.add(tSchematicObj); + else { + GalacticGreg.Logger.warn("Could not load Schematic %s. Please check the syntax", tSchematic); + tErrorsFound++; + } + } catch (Exception e) { + GalacticGreg.Logger.error("Error while loading Schematic %s", tSchematic); + e.printStackTrace(); + } + + } + + GalacticGreg.Logger.info("Successfully loaded %d Schematics", tNewSpaceSchematics.size()); + boolean tDoReplace = true; + + if (tErrorsFound > 0) { + GalacticGreg.Logger.warn("Found %d errors while loading, not all schematics will be available"); + if (pForceReload) + GalacticGreg.Logger.info("Reload was forced, replacing currently active list with new one"); + else { + GalacticGreg.Logger.warn("Nothing was replaced. Fix any errors and reload again"); + tDoReplace = false; + } + } + + if (tDoReplace) _mSpaceSchematics = tNewSpaceSchematics; + + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * Saves the schematic to disk. The schematics name will be used as filename + * + * @param pSchematic + * @return + */ + public boolean SaveSpaceStructure(SpaceSchematic pSchematic) { + try { + if (pSchematic.getName() + .length() < 1) return false; + + JAXBContext tJaxbCtx = JAXBContext.newInstance(SpaceSchematic.class); + Marshaller jaxMarsh = tJaxbCtx.createMarshaller(); + jaxMarsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + jaxMarsh.marshal( + pSchematic, + new FileOutputStream(String.format("%s/%s.xml", _mSchematicsFolderName, pSchematic.getName()), false)); + + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * Load a schematic from disk by the schematic-name itself, without .xml or path + * + * @param pSchematicName + * @return + */ + public SpaceSchematic LoadSpaceSchematic(String pSchematicName) { + return LoadSpaceSchematic(new File(String.format("%s/%s.xml", _mSchematicsFolderName, pSchematicName))); + } + + /** + * Load a schematic file from disk by providing the actual file-object + * + * @param pName + * @return + */ + public SpaceSchematic LoadSpaceSchematic(File pName) { + SpaceSchematic tSchematic = null; + + try { + JAXBContext tJaxbCtx = JAXBContext.newInstance(SpaceSchematic.class); + if (!pName.exists()) { + GalacticGreg.Logger.error("SchematicFile %s could not be found", pName); + return null; + } + + Unmarshaller jaxUnmarsh = tJaxbCtx.createUnmarshaller(); + tSchematic = (SpaceSchematic) jaxUnmarsh.unmarshal(pName); + + } catch (Exception e) { + e.printStackTrace(); + } + + return tSchematic; + } +} |