2727import java .io .BufferedReader ;
2828import java .io .File ;
2929import java .io .IOException ;
30+ import java .io .InputStream ;
3031import java .io .InputStreamReader ;
3132import java .net .URL ;
3233import java .nio .charset .StandardCharsets ;
3738import java .util .stream .Collectors ;
3839
3940import de .bluecolored .bluemap .core .BlueMap ;
41+ import de .bluecolored .bluemap .core .logger .Logger ;
4042import de .bluecolored .bluemap .core .resourcepack .ResourcePack ;
43+ import de .bluecolored .bluemap .core .resourcepack .ResourcePack .Resource ;
4144import ninja .leaping .configurate .ConfigurationNode ;
4245import ninja .leaping .configurate .gson .GsonConfigurationLoader ;
4346import ninja .leaping .configurate .hocon .HoconConfigurationLoader ;
@@ -109,20 +112,103 @@ public File getBiomeConfigFile() {
109112 return new File (configFolder , "biomes.json" );
110113 }
111114
112- public void loadOrCreateConfigs () throws IOException {
113- mainConfig = new MainConfig (loadOrCreate (getMainConfigFile (), defaultMainConfig , mainConfigDefaultValues , true ));
115+ public File getBlockColorConfigFile () {
116+ return new File (configFolder , "blockColors.json" );
117+ }
118+
119+ public void loadMainConfig () throws IOException {
120+ mainConfig = new MainConfig (
121+ loadOrCreate (
122+ getMainConfigFile (),
123+ defaultMainConfig ,
124+ mainConfigDefaultValues ,
125+ true ,
126+ true
127+ )
128+ );
129+ }
130+
131+ public void loadResourceConfigs (ResourcePack resourcePack ) throws IOException {
114132
133+ //load blockColors.json from resources, config-folder and resourcepack
134+ URL blockColorsConfigUrl = BlueMap .class .getResource ("/blockColors.json" );
135+ ConfigurationNode blockColorsConfigNode = loadOrCreate (
136+ getBlockColorConfigFile (),
137+ null ,
138+ blockColorsConfigUrl ,
139+ false ,
140+ false
141+ );
142+ blockColorsConfigNode = joinFromResourcePack (resourcePack , "blockColors.json" , blockColorsConfigNode );
143+ resourcePack .getBlockColorCalculator ().loadColorConfig (blockColorsConfigNode );
144+
145+ //load blockIds.json from resources, config-folder and resourcepack
115146 URL blockIdsConfigUrl = BlueMap .class .getResource ("/blockIds.json" );
116- blockIdConfig = new BlockIdConfig (loadOrCreate (getBlockIdConfigFile (), null , blockIdsConfigUrl , false ), getLoader (makeAutogen (getBlockIdConfigFile ())));
117-
147+ ConfigurationNode blockIdsConfigNode = loadOrCreate (
148+ getBlockIdConfigFile (),
149+ null ,
150+ blockIdsConfigUrl ,
151+ false ,
152+ false
153+ );
154+ blockIdsConfigNode = joinFromResourcePack (resourcePack , "blockIds.json" , blockIdsConfigNode );
155+ blockIdConfig = new BlockIdConfig (
156+ blockIdsConfigNode ,
157+ null //getLoader(makeAutogen(getBlockIdConfigFile()))
158+ );
159+
160+ //load blockProperties.json from resources, config-folder and resourcepack
118161 URL blockPropertiesConfigUrl = BlueMap .class .getResource ("/blockProperties.json" );
119- blockPropertiesConfig = new BlockPropertiesConfig (loadOrCreate (getBlockPropertiesConfigFile (), null , blockPropertiesConfigUrl , false ), getLoader (makeAutogen (getBlockPropertiesConfigFile ())));
162+ ConfigurationNode blockPropertiesConfigNode = loadOrCreate (
163+ getBlockPropertiesConfigFile (),
164+ null ,
165+ blockPropertiesConfigUrl ,
166+ false ,
167+ false
168+ );
169+ blockPropertiesConfigNode = joinFromResourcePack (resourcePack , "blockProperties.json" , blockPropertiesConfigNode );
170+ blockPropertiesConfig = new BlockPropertiesConfig (
171+ blockPropertiesConfigNode ,
172+ resourcePack ,
173+ null //getLoader(makeAutogen(getBlockPropertiesConfigFile()))
174+ );
120175
176+ //load biomes.json from resources, config-folder and resourcepack
121177 URL biomeConfigUrl = BlueMap .class .getResource ("/biomes.json" );
122- biomeConfig = new BiomeConfig (loadOrCreate (getBiomeConfigFile (), null , biomeConfigUrl , false ), getLoader (makeAutogen (getBiomeConfigFile ())));
178+ ConfigurationNode biomeConfigNode = loadOrCreate (
179+ getBiomeConfigFile (),
180+ null ,
181+ biomeConfigUrl ,
182+ false ,
183+ false
184+ );
185+ biomeConfigNode = joinFromResourcePack (resourcePack , "biomes.json" , biomeConfigNode );
186+ biomeConfig = new BiomeConfig (
187+ biomeConfigNode ,
188+ null //getLoader(makeAutogen(getBiomeConfigFile()))
189+ );
123190 }
124191
125- private ConfigurationNode loadOrCreate (File configFile , URL defaultConfig , URL defaultValues , boolean usePlaceholders ) throws IOException {
192+ private ConfigurationNode joinFromResourcePack (ResourcePack resourcePack , String configFileName , ConfigurationNode defaultConfig ) {
193+ ConfigurationNode joinedNode = null ;
194+ for (Resource resource : resourcePack .getConfigAdditions (configFileName )) {
195+ try {
196+ ConfigurationNode node = getLoader (configFileName , resource .read ()).load ();
197+ if (joinedNode == null ) joinedNode = node ;
198+ else joinedNode .mergeValuesFrom (node );
199+ } catch (IOException ex ) {
200+ Logger .global .logWarning ("Failed to load an additional " + configFileName + " from the resource-pack! " + ex );
201+ }
202+ }
203+
204+ if (joinedNode == null ) return defaultConfig ;
205+
206+ joinedNode .mergeValuesFrom (defaultConfig );
207+
208+ return joinedNode ;
209+ }
210+
211+ private ConfigurationNode loadOrCreate (File configFile , URL defaultConfig , URL defaultValues , boolean usePlaceholders , boolean generateEmptyConfig ) throws IOException {
126212
127213 ConfigurationNode configNode ;
128214 if (!configFile .exists ()) {
@@ -153,7 +239,7 @@ private ConfigurationNode loadOrCreate(File configFile, URL defaultConfig, URL d
153239 configNode = loader .createEmptyNode ();
154240
155241 //save to create file
156- loader .save (configNode );
242+ if ( generateEmptyConfig ) loader .save (configNode );
157243 }
158244 } else {
159245 //load config
@@ -169,11 +255,21 @@ private ConfigurationNode loadOrCreate(File configFile, URL defaultConfig, URL d
169255 return configNode ;
170256 }
171257
258+ /*
172259 private File makeAutogen(File file) throws IOException {
173260 File autogenFile = file.getCanonicalFile().toPath().getParent().resolve("generated").resolve(file.getName()).toFile();
174261 autogenFile.getParentFile().mkdirs();
175262 return autogenFile;
176263 }
264+ */
265+
266+ private ConfigurationLoader <? extends ConfigurationNode > getLoader (String filename , InputStream is ){
267+ BufferedReader reader = new BufferedReader (new InputStreamReader (is , StandardCharsets .UTF_8 ));
268+
269+ if (filename .endsWith (".json" )) return GsonConfigurationLoader .builder ().setSource (() -> reader ).build ();
270+ if (filename .endsWith (".yaml" ) || filename .endsWith (".yml" )) return YAMLConfigurationLoader .builder ().setSource (() -> reader ).build ();
271+ else return HoconConfigurationLoader .builder ().setSource (() -> reader ).build ();
272+ }
177273
178274 private ConfigurationLoader <? extends ConfigurationNode > getLoader (URL url ){
179275 if (url .getFile ().endsWith (".json" )) return GsonConfigurationLoader .builder ().setURL (url ).build ();
0 commit comments