The Short Version:
The new section, <StructureHpBlockMultiplier>, causes the server to go into an infinite java error loop if it's included in the customBlockBehaviorConfig.xml file, even though it is found in the default BlockBehaviorConfig.xml file found in the /data/config folder.
The Journey:
Hello, I'm the tech admin for the Light vs Dark server. We are attempting to upgrade to the latest version, however the server was crashing into an infinite loop error. At first, [[ http://prnt.sc/c6agdz | all seems fine ]]. The update goes through successfully and the server starts. I had also rebuilt all of the custom config files from the new versions in a fresh install. However, as soon as anyone logs into the server, it starts with an infinite error loop, without hard crashing. This completely fills the log files within just a few seconds, with over 40,000 lines of error messages a second. We are running on Ubuntu 16 server with Sun Java 64-bit. There are a few variants of the error loop that occurred, but what ties them together is they both have the java exception that the "revertBlockBehaviorConfig.xml" is not found. I managed to get to the bottom of it, but it was a journey.
**Short story:**
The new section, "<StructureHpBlockMultiplier>", of the blockBehaviorConfig.xml from the /data/config folder CANNOT be in the customBlockBehaviorConfig.xml file, otherwise it causes the crash.
**The Journey:**
Here's what the error loop looked like immediately following the first update, before the hotfix:
On version, 20160812_205821 v0.199.152:
```
[2016-08-13 02:33:15] ON CLIENT: false
[2016-08-13 02:33:15] java.lang.IllegalArgumentException: No enum constant obfuscated.YF.STATUS_ARMOR_HP_ABSORBTION_BONUS
[2016-08-13 02:33:15] at java.lang.Enum.valueOf(Enum.java:238)
[2016-08-13 02:33:15] at obfuscated.YF.valueOf(SourceFile:24)
[2016-08-13 02:33:15] at org.schema.game.common.controller.elements.UsableElementManager.parse(SourceFile:221)
[2016-08-13 02:33:15] at org.schema.game.common.controller.elements.ManagerContainer.reparseBlockBehavior(SourceFile:284)
[2016-08-13 02:33:15] at org.schema.game.common.controller.elements.ManagerContainer.<init>(SourceFile:194)
[2016-08-13 02:33:15] at org.schema.game.common.controller.elements.ShipManagerContainer.<init>(SourceFile:214)
[2016-08-13 02:33:15] at obfuscated.VP.<init>(SourceFile:146)
[2016-08-13 02:33:15] at org.schema.game.common.data.world.Universe.loadEntity(SourceFile:339)
[2016-08-13 02:33:15] at obfuscated.agn.a(SourceFile:1428)
[2016-08-13 02:33:15] at obfuscated.agn.a(SourceFile:1400)
[2016-08-13 02:33:15] at obfuscated.agn.a(SourceFile:1287)
[2016-08-13 02:33:15] at org.schema.game.common.data.world.Universe.loadOrGenerateSector(SourceFile:951)
[2016-08-13 02:33:15] at org.schema.game.common.data.world.Universe.getSector(SourceFile:647)
[2016-08-13 02:33:15] at org.schema.game.common.data.world.Universe.getSector(SourceFile:641)
[2016-08-13 02:33:15] at org.schema.game.server.controller.GameServerController.onLoggedIn(SourceFile:1734)
[2016-08-13 02:33:15] at org.schema.schine.network.server.ServerController.registerClient(SourceFile:148)
[2016-08-13 02:33:15] at org.schema.schine.network.commands.LoginRequest.login(SourceFile:95)
[2016-08-13 02:33:15] at org.schema.schine.network.commands.LoginRequest.run(SourceFile:202)
[2016-08-13 02:33:15] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[2016-08-13 02:33:15] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[2016-08-13 02:33:15] at java.lang.Thread.run(Thread.java:745)
[2016-08-13 02:33:15] java.io.FileNotFoundException: /home/starmade/starmade/StarMade/./data/config/revertBlockBehaviorConfig.xml (No such file or directory)
[2016-08-13 02:33:15] at java.io.FileInputStream.open0(Native Method)
[2016-08-13 02:33:15] at java.io.FileInputStream.open(FileInputStream.java:195)
[2016-08-13 02:33:15] at java.io.FileInputStream.<init>(FileInputStream.java:138)
[2016-08-13 02:33:15] at java.io.FileInputStream.<init>(FileInputStream.java:93)
[2016-08-13 02:33:15] at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
[2016-08-13 02:33:15] at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
[2016-08-13 02:33:15] at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:623)
[2016-08-13 02:33:15] at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
[2016-08-13 02:33:15] at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
[2016-08-13 02:33:15] at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
[2016-08-13 02:33:15] at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
[2016-08-13 02:33:15] at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
[2016-08-13 02:33:15] at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
[2016-08-13 02:33:15] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:205)
[2016-08-13 02:33:15] at obfuscated.f.a(SourceFile:37)
[2016-08-13 02:33:15] at org.schema.game.server.controller.GameServerController.c(SourceFile:2992)
[2016-08-13 02:33:15] at org.schema.game.common.controller.elements.ManagerContainer.reparseBlockBehavior(SourceFile:294)
[2016-08-13 02:33:15] at org.schema.game.common.controller.elements.ManagerContainer.<init>(SourceFile:194)
[2016-08-13 02:33:15] at org.schema.game.common.controller.elements.ShipManagerContainer.<init>(SourceFile:214)
[2016-08-13 02:33:15] at obfuscated.VP.<init>(SourceFile:146)
[2016-08-13 02:33:15] at org.schema.game.common.data.world.Universe.loadEntity(SourceFile:339)
[2016-08-13 02:33:15] at obfuscated.agn.a(SourceFile:1428)
[2016-08-13 02:33:15] at obfuscated.agn.a(SourceFile:1400)
[2016-08-13 02:33:15] at obfuscated.agn.a(SourceFile:1287)
[2016-08-13 02:33:15] at org.schema.game.common.data.world.Universe.loadOrGenerateSector(SourceFile:951)
[2016-08-13 02:33:15] at org.schema.game.common.data.world.Universe.getSector(SourceFile:647)
[2016-08-13 02:33:15] at org.schema.game.common.data.world.Universe.getSector(SourceFile:641)
[2016-08-13 02:33:15] at org.schema.game.server.controller.GameServerController.onLoggedIn(SourceFile:1734)
[2016-08-13 02:33:15] at org.schema.schine.network.server.ServerController.registerClient(SourceFile:148)
[2016-08-13 02:33:15] at org.schema.schine.network.commands.LoginRequest.login(SourceFile:95)
[2016-08-13 02:33:15] at org.schema.schine.network.commands.LoginRequest.run(SourceFile:202)
[2016-08-13 02:33:15] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[2016-08-13 02:33:15] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[2016-08-13 02:33:15] at java.lang.Thread.run(Thread.java:745)
```
Here's what it looked like after installing the hotfix:
```
[2016-08-16 02:56:17] org.schema.common.ConfigParserException: HpConditionTriggerList -> Item; trigger amount must be a positive value in <Amount>
(FixSuggestion: check your xml config files)
[2016-08-16 02:56:17] at obfuscated.US.a(SourceFile:42)
[2016-08-16 02:56:17] at obfuscated.UQ.a(SourceFile:23)
[2016-08-16 02:56:17] at obfuscated.UR.a(SourceFile:34)
[2016-08-16 02:56:17] at org.schema.game.common.controller.elements.UsableElementManager.parse(SourceFile:210)
[2016-08-16 02:56:17] at org.schema.game.common.controller.elements.ManagerContainer.reparseBlockBehavior(SourceFile:284)
[2016-08-16 02:56:17] at org.schema.game.common.controller.elements.ManagerContainer.<init>(SourceFile:194)
[2016-08-16 02:56:17] at org.schema.game.common.controller.elements.ShipManagerContainer.<init>(SourceFile:214)
[2016-08-16 02:56:17] at obfuscated.VP.<init>(SourceFile:146)
[2016-08-16 02:56:17] at org.schema.game.common.data.world.Universe.loadEntity(SourceFile:339)
[2016-08-16 02:56:17] at obfuscated.agn.a(SourceFile:1428)
[2016-08-16 02:56:17] at obfuscated.agn.a(SourceFile:1400)
[2016-08-16 02:56:17] at obfuscated.agn.a(SourceFile:1287)
[2016-08-16 02:56:17] at org.schema.game.common.data.world.Universe.loadOrGenerateSector(SourceFile:951)
[2016-08-16 02:56:17] at org.schema.game.common.data.world.Universe.getSector(SourceFile:647)
[2016-08-16 02:56:17] at org.schema.game.common.data.world.Universe.getSector(SourceFile:641)
[2016-08-16 02:56:17] at org.schema.game.server.controller.GameServerController.onLoggedIn(SourceFile:1734)
[2016-08-16 02:56:17] at org.schema.schine.network.server.ServerController.registerClient(SourceFile:148)
[2016-08-16 02:56:17] at org.schema.schine.network.commands.LoginRequest.login(SourceFile:95)
[2016-08-16 02:56:17] at org.schema.schine.network.commands.LoginRequest.run(SourceFile:202)
[2016-08-16 02:56:17] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[2016-08-16 02:56:17] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[2016-08-16 02:56:17] at java.lang.Thread.run(Thread.java:745)
[2016-08-16 02:56:17] java.io.FileNotFoundException: /home/starmade/starmade-new_and_working_but_very_buggy/StarMade/./data/config/revertBlockBehaviorConfig.xml (No such file or directory)
[2016-08-16 02:56:17] at java.io.FileInputStream.open0(Native Method)
[2016-08-16 02:56:17] at java.io.FileInputStream.open(FileInputStream.java:195)
[2016-08-16 02:56:17] at java.io.FileInputStream.<init>(FileInputStream.java:138)
[2016-08-16 02:56:17] at java.io.FileInputStream.<init>(FileInputStream.java:93)
[2016-08-16 02:56:17] at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
[2016-08-16 02:56:17] at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
[2016-08-16 02:56:17] at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:623)
[2016-08-16 02:56:17] at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
[2016-08-16 02:56:17] at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
[2016-08-16 02:56:17] at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
[2016-08-16 02:56:17] at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
[2016-08-16 02:56:17] at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
[2016-08-16 02:56:17] at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
[2016-08-16 02:56:17] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:205)
[2016-08-16 02:56:17] at obfuscated.f.a(SourceFile:37)
[2016-08-16 02:56:17] at org.schema.game.server.controller.GameServerController.c(SourceFile:2992)
[2016-08-16 02:56:17] at org.schema.game.common.controller.elements.ManagerContainer.reparseBlockBehavior(SourceFile:294)
[2016-08-16 02:56:17] at org.schema.game.common.controller.elements.ManagerContainer.<init>(SourceFile:194)
[2016-08-16 02:56:17] at org.schema.game.common.controller.elements.ShipManagerContainer.<init>(SourceFile:214)
[2016-08-16 02:56:17] at obfuscated.VP.<init>(SourceFile:146)
[2016-08-16 02:56:17] at org.schema.game.common.data.world.Universe.loadEntity(SourceFile:339)
[2016-08-16 02:56:17] at obfuscated.agn.a(SourceFile:1428)
[2016-08-16 02:56:17] at obfuscated.agn.a(SourceFile:1400)
[2016-08-16 02:56:17] at obfuscated.agn.a(SourceFile:1287)
[2016-08-16 02:56:17] at org.schema.game.common.data.world.Universe.loadOrGenerateSector(SourceFile:951)
[2016-08-16 02:56:17] at org.schema.game.common.data.world.Universe.getSector(SourceFile:647)
[2016-08-16 02:56:17] at org.schema.game.common.data.world.Universe.getSector(SourceFile:641)
[2016-08-16 02:56:17] at org.schema.game.server.controller.GameServerController.onLoggedIn(SourceFile:1734)
[2016-08-16 02:56:17] at org.schema.schine.network.server.ServerController.registerClient(SourceFile:148)
[2016-08-16 02:56:17] at org.schema.schine.network.commands.LoginRequest.login(SourceFile:95)
[2016-08-16 02:56:17] at org.schema.schine.network.commands.LoginRequest.run(SourceFile:202)
[2016-08-16 02:56:17] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[2016-08-16 02:56:17] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[2016-08-16 02:56:17] at java.lang.Thread.run(Thread.java:745)
[2016-08-16 02:56:17] ON CLIENT: false
```
Here is another example:
```
[2016-08-15 04:06:31] ON CLIENT: false
[2016-08-15 04:06:31] java.lang.NullPointerException
[2016-08-15 04:06:31] at org.schema.game.common.controller.elements.UsableElementManager.parse(SourceFile:154)
[2016-08-15 04:06:31] at org.schema.game.common.controller.elements.ManagerContainer.reparseBlockBehavior(SourceFile:284)
[2016-08-15 04:06:31] at org.schema.game.common.controller.elements.ManagerContainer.<init>(SourceFile:194)
[2016-08-15 04:06:31] at org.schema.game.common.controller.elements.ShipManagerContainer.<init>(SourceFile:214)
[2016-08-15 04:06:31] at obfuscated.VP.<init>(SourceFile:146)
[2016-08-15 04:06:31] at org.schema.game.common.data.world.Universe.loadEntity(SourceFile:339)
[2016-08-15 04:06:31] at obfuscated.agn.a(SourceFile:1428)
[2016-08-15 04:06:31] at obfuscated.agn.a(SourceFile:1400)
[2016-08-15 04:06:31] at obfuscated.agn.a(SourceFile:1287)
[2016-08-15 04:06:31] at org.schema.game.common.data.world.Universe.loadOrGenerateSector(SourceFile:951)
[2016-08-15 04:06:31] at org.schema.game.common.data.world.Universe.getSector(SourceFile:647)
[2016-08-15 04:06:31] at org.schema.game.common.data.world.Universe.getSector(SourceFile:641)
[2016-08-15 04:06:31] at org.schema.game.server.controller.GameServerController.onLoggedIn(SourceFile:1734)
[2016-08-15 04:06:31] at org.schema.schine.network.server.ServerController.registerClient(SourceFile:148)
[2016-08-15 04:06:31] at org.schema.schine.network.commands.LoginRequest.login(SourceFile:95)
[2016-08-15 04:06:31] at org.schema.schine.network.commands.LoginRequest.run(SourceFile:202)
[2016-08-15 04:06:31] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[2016-08-15 04:06:31] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[2016-08-15 04:06:31] at java.lang.Thread.run(Thread.java:745)
[2016-08-15 04:06:31] java.io.FileNotFoundException: /home/starmade/starmade-new_and_working_but_very_buggy/StarMade/./data/config/revertBlockBehaviorConfig.xml (No such file or directory)
[2016-08-15 04:06:31] at java.io.FileInputStream.open0(Native Method)
[2016-08-15 04:06:31] at java.io.FileInputStream.open(FileInputStream.java:195)
[2016-08-15 04:06:31] at java.io.FileInputStream.<init>(FileInputStream.java:138)
[2016-08-15 04:06:31] at java.io.FileInputStream.<init>(FileInputStream.java:93)
[2016-08-15 04:06:31] at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
[2016-08-15 04:06:31] at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
[2016-08-15 04:06:31] at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:623)
[2016-08-15 04:06:31] at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
[2016-08-15 04:06:31] at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
[2016-08-15 04:06:31] at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
[2016-08-15 04:06:31] at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
[2016-08-15 04:06:31] at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
[2016-08-15 04:06:31] at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
[2016-08-15 04:06:31] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:205)
[2016-08-15 04:06:31] at obfuscated.f.a(SourceFile:37)
[2016-08-15 04:06:31] at org.schema.game.server.controller.GameServerController.c(SourceFile:2992)
[2016-08-15 04:06:31] at org.schema.game.common.controller.elements.ManagerContainer.reparseBlockBehavior(SourceFile:294)
[2016-08-15 04:06:31] at org.schema.game.common.controller.elements.ManagerContainer.<init>(SourceFile:194)
[2016-08-15 04:06:31] at org.schema.game.common.controller.elements.ShipManagerContainer.<init>(SourceFile:214)
[2016-08-15 04:06:31] at obfuscated.VP.<init>(SourceFile:146)
[2016-08-15 04:06:31] at org.schema.game.common.data.world.Universe.loadEntity(SourceFile:339)
[2016-08-15 04:06:31] at obfuscated.agn.a(SourceFile:1428)
[2016-08-15 04:06:31] at obfuscated.agn.a(SourceFile:1400)
[2016-08-15 04:06:31] at obfuscated.agn.a(SourceFile:1287)
[2016-08-15 04:06:31] at org.schema.game.common.data.world.Universe.loadOrGenerateSector(SourceFile:951)
[2016-08-15 04:06:31] at org.schema.game.common.data.world.Universe.getSector(SourceFile:647)
[2016-08-15 04:06:31] at org.schema.game.common.data.world.Universe.getSector(SourceFile:641)
[2016-08-15 04:06:31] at org.schema.game.server.controller.GameServerController.onLoggedIn(SourceFile:1734)
[2016-08-15 04:06:31] at org.schema.schine.network.server.ServerController.registerClient(SourceFile:148)
[2016-08-15 04:06:31] at org.schema.schine.network.commands.LoginRequest.login(SourceFile:95)
[2016-08-15 04:06:31] at org.schema.schine.network.commands.LoginRequest.run(SourceFile:202)
[2016-08-15 04:06:31] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[2016-08-15 04:06:31] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[2016-08-15 04:06:31] at java.lang.Thread.run(Thread.java:745)
```
Here are the steps I took to troubleshoot the issue after experiencing the bugs:
1. After the initial update (and before the hotfix came out), the loop error was new. So I attempted to create a new world. This was successful. The world loaded and players could join the server. However, we do not want to do a full world reset, so I continued to troubleshoot.
2. I attempted to start the server again with the our 2 month old world file. It crashed with the same error loop.
3. I disabled all the custom configuration files, with our 2 month old world file. People could now join, but the game was not running stable.
4. I noticed that the "FactionConfig.xml" file said "error" in it's name, like "FactionConfigError.xml". So I went ahead and updated the file based on the "/data/config" folder. I also re-enabled the other custom config files, since they did not have an "error" in their names.
5. I attempted to run the server again, and the same loop of errors happened.
6. I created a completely fresh install with version 20160812_205821 v0.199.152 (this was before the hotfix version). I added blueprints, the established world file, and other settings files, except the custom configuration files.
7. I attempted to run the server, without the custom configuration files, and it ran with our old world file.
8. I completely rebuilt all the custom configuration files using the "/data/config" files from the fresh install as the basis. I whittled them down to only the settings I wished to change, being careful not to mess up the data structures of the XML files. New copies of the "FactionConfig.xml," "BlockConfigImport.xml," and "customBlockBehaviorConfig.xml" files were created and I placed them in the appropriate directories within the StarMade folder.
9. I started the server again, and the same type of java error loop happened.
10. I disabled all the custom config files and attempted to start the server. It worked and players could join.
11. I ran the update for the server and upgraded to 20160814_215551 v0.199.152.
12. I ran the server without the custom config files, and players could join.
13. I rebuild all the custom config files again with the files found in the "/data/config" folder and the same bug happened. To reiterate the bug, everything looks fine upon startup until a player logs in, then an endless java error loop occurs.
14. I disabled all but one of the configuration files. I determined that the server could run with the custom block config and the custom faction config files enabled, but NOT the "customBlockBehaviorConfig.xml" file.
15. I simply took the "blockBehaviorConfig.xml" file from the "/data/config/" folder and placed a copy into the "StarMade/customBlockBehaviorConfig/" folder, renaming it, "customBlockBehaviorConfig.xml". I made absolutely no changes to the file whatsoever, to rule out any possibility of a mistake of my own doing in the custom config file (even though I had already completely rebuild it twice and looked it over several times to ensure it was right.)
16. I attempted to run the server again, and it had the same kind of java crash loop still!
17. I attempted to simplify the unaltered copy of the "blockBehaviorConfig.xml" file, to only include the first set of options. It looks like this:
```
<BlockBehavior>
<General>
<BasicValues>
<DefensiveEffectMaxPercentMassMult>10</DefensiveEffectMaxPercentMassMult> <!-- multiplication of mass used as max percent for defensive effects: ratio = effectBlockCount / (mass*DefensiveEffectMaxPercentMassMult)-->
<ShieldExtraCapacityMultPerUnit>1</ShieldExtraCapacityMultPerUnit> <!-- totalUnitShieldRecharge = (unitSize*ShieldExtraRechargeMultPerUnit) -->
<ShieldExtraRechargeMultPerUnit>1</ShieldExtraRechargeMultPerUnit> <!-- shieldCapacity = ((totalUnitShieldCapacity*ShieldCapacityPreMul)^ShieldCapacityPow)*ShieldCapacityTotalMul -->
<ShieldDoInitialWithoutFromCore>true</ShieldDoInitialWithoutFromCore> <!-- if true, the ship will have initial shields without any shield blocks. if false, the initial values are added when the first shield block is placed -->
<ShieldCapacityInitial>220</ShieldCapacityInitial> <!-- initial shield capacity on ships without shieldCapacity blocks -->
<ShieldRechargeInitial>0</ShieldRechargeInitial> <!-- initial shield recharge on ships without shieldRecharge blocks -->
<ShieldCapacityPow>0.9791797578</ShieldCapacityPow>
<ShieldCapacityPreMul>1.0</ShieldCapacityPreMul>
<ShieldCapacityTotalMul>110</ShieldCapacityTotalMul> <!-- shieldCapacity = ((totalUnitShieldCapacity*ShieldCapacityPreMul)^ShieldCapacityPow)*ShieldCapacityTotalMul -->
<ShieldRechargePow>1.0</ShieldRechargePow> <!-- shieldCapacity = ((totalUnitShieldCapacity*1.0)^0.9)*55 -->
<ShieldRechargePreMul>1.0</ShieldRechargePreMul>
<ShieldRechargeTotalMul>5.5</ShieldRechargeTotalMul>
<ShieldRechargeCycleTime>1.0</ShieldRechargeCycleTime> <!-- time in secs between recharge cycles. This value is relative, so changing it won't affect the time a ship needs to fully recharge (e.g. twice as many cycles -> half as many reacharge per cycle)-->
<ShieldRecoveryTimeAfterOutage>10</ShieldRecoveryTimeAfterOutage> <!-- time, the shield will not recharge after reaching 0 -->
<ShieldDirectRecoveryTime>60</ShieldDirectRecoveryTime> <!-- this time is set to the value gives after each hit sustained. In direct recovery, <ShieldRecoveryMultPerPercent> is applied. Otherwise it's running on full recharge -->
<ShieldRecoveryMultPerPercent>0.5</ShieldRecoveryMultPerPercent> <!-- MAX % at high health - in direct recovery, the shield recharge will be multiplied by (1-((shield/max)*thisValue));-->
<ShieldRecoveryMult>0.25</ShieldRecoveryMult> <!-- MAX % at low health - in direct recovery, the shield recharge will be multiplied: recharge = recharge*thisValue;-->
<ShieldRechargePowerConsuption>10</ShieldRechargePowerConsuption> <!-- (when shield < 100%) per regen point -->
<ShieldFullPowerConsuption>1</ShieldFullPowerConsuption> <!-- (when shield == 100%) per regen point -->
<ShieldDockTransferLimit>0.25</ShieldDockTransferLimit> <!-- Up to which fill status a rail docked entity up in the chain (towards root) will take the hit (e.g. 0.25 means that a mothership (and docks inbetween) will take the shots of a turret or other rail dock as long as they have more than 25% of their max shields left -->
<PowerDivFactor>0.333</PowerDivFactor>
<PowerCeiling>2000000.0</PowerCeiling>
<PowerGrowth>1.000348</PowerGrowth>
<PowerLinearGrowth>25.0</PowerLinearGrowth>
<PowerRecoveryTime>1000</PowerRecoveryTime>
<PowerBaseCapacity>50000</PowerBaseCapacity>
<PowerTankCapacityLinear>1000</PowerTankCapacityLinear> <!-- multiplication per unit -->
<PowerTankCapacityPow>1.05</PowerTankCapacityPow> <!-- unitSize^x per unit -->
<TakeOffEffectPowerConsumptionMult>1</TakeOffEffectPowerConsumptionMult> <!-- multiplied by force -->
<EvadeEffectPowerConsumptionMult>1</EvadeEffectPowerConsumptionMult> <!-- multiplied by force -->
<PersonalSalvageBeamBonus>1.25</PersonalSalvageBeamBonus> <!-- bonus mult of raw resources when salvaging with handheld salvage beam (everything between whole numbers is chance (e.g. 1.25 give 25% chance of an extra raw yield) -->
<RailMassEnhancerFreeMass>50.0</RailMassEnhancerFreeMass> <!-- mass that is free to place without the need of a rail mass enhancer -->
<RailMassEnhancerMassPerEnhancer>5.0</RailMassEnhancerMassPerEnhancer> <!-- how much mass is free to place for each rail mass enhancer in the structure -->
<RailMassEnhancerPowerConsumedPerEnhancer>50.0</RailMassEnhancerPowerConsumedPerEnhancer> <!-- How much power per second is consumed my rail enhancer blocks -->
<RailMassEnhancerPercentCostPerMassAboveEnhancerProvided>0.05</RailMassEnhancerPercentCostPerMassAboveEnhancerProvided> <!-- how much % of mass speed (between 0 and 1) is subtracted for every one mass placed on a dock that is above the current mass limit (free blocks + enhancers) (e.g. at 0.1, for every block placed the speed is one percent slower)-->
<PlanetPowerBaseCapacity>500</PlanetPowerBaseCapacity>
<AsteroidPowerBaseCapacity>500</AsteroidPowerBaseCapacity>
<StructureHpBlockMultiplier>1.0</StructureHpBlockMultiplier> <!-- how much of the hp value is added to the systemHP -->
<HpDeductionLogOffset>-5</HpDeductionLogOffset>
<HpDeductionLogFactor>0.7</HpDeductionLogFactor> <!-- deducted hit points on damage: blockHP + HpDeductionLogFactor*(max(0, log10(maxHP)+HpDeductionLogOffset)) * blockHP -->
<ShipRebootTimeInSecPerMissingHpPercent>40.0</ShipRebootTimeInSecPerMissingHpPercent> <!-- on 0% hp, the full value in seconds is needed to reboot -->
<ShipRebootTimeMultiplierPerMass>0.0002</ShipRebootTimeMultiplierPerMass> <!-- secondsToReboot * (mass * ShipRebootTimeMultiplyerPerMass) -->
<ShipRebootTimeMinSec>30.0</ShipRebootTimeMinSec> <!-- Minimum time in secs a reboot will take -->
<ArmorHpAbsorbtion>0.5</ArmorHpAbsorbtion> <!-- absorbedDamageToArmorHP = ArmorHpAbsorbtion; How much damage of a shot can be absorbed to armorHP; this is a static value; set it to 0 if you want to use a dynamic variance instead with ArmorHpDamageThreshold-->
<ArmorHpAbsorbedDamageMultiplier>1.0</ArmorHpAbsorbedDamageMultiplier> <!-- How much absorbed damaged is deducted from armorHP -->
<ArmorHpBlockMultiplier>1.0</ArmorHpBlockMultiplier> <!-- how much of the armor value is added to the armorHP -->
<ArmorHpDamageThreshold>1.0</ArmorHpDamageThreshold> <!-- absorbedDamageToArmorHP = (ArmorHpDamageThreshold * [armorhp of the block]) * [current ArmorHp Left On Ship]; Note: this is not used as long as ArmorHpAbsorbtion != 0; This means, a ship wont take damage other than armorHP damage as long as a single shot isn't above the trheshold; -->
<AITurretMinOrientationSpeed>0.5</AITurretMinOrientationSpeed> <!-- Minimum turret orientation speed by mass used by AI (still depends on enhancer) -->
<AITurretMaxOrientationSpeed>3.5</AITurretMaxOrientationSpeed> <!-- Maximum turret orientation speed by mass used by AI (still depends on enhancer) -->
<AITurretOrientationSpeedDivByMass>50.0</AITurretOrientationSpeedDivByMass> <!-- speed = AITurretOrientationSpeedDivByMass / mass -->
<ExplosionShieldDamageBonus>0.0</ExplosionShieldDamageBonus> <!-- all explosions (missile/warhead/pulse) do [damage + damage * bonus] against shields-->
<ExplosionHullDamageBonus>0.0</ExplosionHullDamageBonus> <!-- all explosions (missile/warhead/pulse) do [damage + damage * bonus] against blocks (will also hurt armor more)-->
<VolumeMassMultiplier>0.01</VolumeMassMultiplier> <!-- how much of the volume of an item in an inventory/storage/cargo adds to the mass of a structure -->
<HpConditionTriggerList>
<Item conditionhp="0.9">
<Type>POWER</Type>
<Amount>0.9</Amount>
</Item>
<Item conditionhp="0.9">
<Type>SHIELD</Type>
<Amount>0.9</Amount>
</Item>
<Item conditionhp="0.9">
<Type>THRUST</Type>
<Amount>0.9</Amount>
</Item>
<Item conditionhp="0.8">
<Type>POWER</Type>
<Amount>0.8</Amount>
</Item>
<Item conditionhp="0.8">
<Type>SHIELD</Type>
<Amount>0.8</Amount>
</Item>
<Item conditionhp="0.8">
<Type>THRUST</Type>
<Amount>0.8</Amount>
</Item>
<Item conditionhp="0.7">
<Type>POWER</Type>
<Amount>0.7</Amount>
</Item>
<Item conditionhp="0.7">
<Type>SHIELD</Type>
<Amount>0.7</Amount>
</Item>
<Item conditionhp="0.7">
<Type>THRUST</Type>
<Amount>0.7</Amount>
</Item>
<Item conditionhp="0.6">
<Type>POWER</Type>
<Amount>0.5</Amount>
</Item>
<Item conditionhp="0.6">
<Type>SHIELD</Type>
<Amount>0.5</Amount>
</Item>
<Item conditionhp="0.6">
<Type>THRUST</Type>
<Amount>0.5</Amount>
</Item>
<Item conditionhp="0.55">
<Type>CONTROL_LOSS</Type>
</Item>
<Item conditionhp="0.5">
<Type>OVERHEATING</Type>
</Item>
<Item conditionhp="0.5">
<Type>POWER</Type>
<Amount>0.0</Amount>
</Item>
<Item conditionhp="0.5">
<Type>SHIELD</Type>
<Amount>0.0</Amount>
</Item>
<Item conditionhp="0.5">
<Type>THRUST</Type>
<Amount>0.5</Amount>
</Item>
</HpConditionTriggerList>
</BasicValues>
</General>
</BlockBehavior>
```
18. I started the server again. It started like normal. When I tried to connect, it gave the same kind of java error loop, but with the "[2016-08-16 02:56:17] org.schema.common.ConfigParserException: HpConditionTriggerList -> Item; trigger amount must be a positive value in <Amount>" error included. (This is listed above as one of the examples)
19. I simplified the customBlockBehaviorConfig.xml file further to be merely:
```
<BlockBehavior>
<General>
<BasicValues>
<DefensiveEffectMaxPercentMassMult>10</DefensiveEffectMaxPercentMassMult> <!-- multiplication of mass used as max percent for defensive effects: ratio = effectBlockCount / (mass*DefensiveEffectMaxPercentMassMult)-->
</BasicValues>
</General>
</BlockBehavior>
```
20. This actually started.
21. So I shut down the server normally. And decided to change the customBlockBehaviorConfig.xml file to make it a bit larger but cut out the part with the "StructureHpBlockMultiplier" settings.:
```
<BlockBehavior>
<General>
<BasicValues>
<DefensiveEffectMaxPercentMassMult>10</DefensiveEffectMaxPercentMassMult> <!-- multiplication of mass used as max percent for defensive effects: ratio = effectBlockCount / (mass*DefensiveEffectMaxPercentMassMult)-->
<ShieldExtraCapacityMultPerUnit>1</ShieldExtraCapacityMultPerUnit> <!-- totalUnitShieldRecharge = (unitSize*ShieldExtraRechargeMultPerUnit) -->
<ShieldExtraRechargeMultPerUnit>1</ShieldExtraRechargeMultPerUnit> <!-- shieldCapacity = ((totalUnitShieldCapacity*ShieldCapacityPreMul)^ShieldCapacityPow)*ShieldCapacityTotalMul -->
<ShieldDoInitialWithoutFromCore>true</ShieldDoInitialWithoutFromCore> <!-- if true, the ship will have initial shields without any shield blocks. if false, the initial values are added when the first shield block is placed -->
<ShieldCapacityInitial>220</ShieldCapacityInitial> <!-- initial shield capacity on ships without shieldCapacity blocks -->
<ShieldRechargeInitial>0</ShieldRechargeInitial> <!-- initial shield recharge on ships without shieldRecharge blocks -->
<ShieldCapacityPow>0.9791797578</ShieldCapacityPow>
<ShieldCapacityPreMul>1.0</ShieldCapacityPreMul>
<ShieldCapacityTotalMul>110</ShieldCapacityTotalMul> <!-- shieldCapacity = ((totalUnitShieldCapacity*ShieldCapacityPreMul)^ShieldCapacityPow)*ShieldCapacityTotalMul -->
<ShieldRechargePow>1.0</ShieldRechargePow> <!-- shieldCapacity = ((totalUnitShieldCapacity*1.0)^0.9)*55 -->
<ShieldRechargePreMul>1.0</ShieldRechargePreMul>
<ShieldRechargeTotalMul>5.5</ShieldRechargeTotalMul>
<ShieldRechargeCycleTime>1.0</ShieldRechargeCycleTime> <!-- time in secs between recharge cycles. This value is relative, so changing it won't affect the time a ship needs to fully recharge (e.g. twice as many cycles -> half as many reacharge per cycle)-->
<ShieldRecoveryTimeAfterOutage>10</ShieldRecoveryTimeAfterOutage> <!-- time, the shield will not recharge after reaching 0 -->
<ShieldDirectRecoveryTime>60</ShieldDirectRecoveryTime> <!-- this time is set to the value gives after each hit sustained. In direct recovery, <ShieldRecoveryMultPerPercent> is applied. Otherwise it's running on full recharge -->
<ShieldRecoveryMultPerPercent>0.5</ShieldRecoveryMultPerPercent> <!-- MAX % at high health - in direct recovery, the shield recharge will be multiplied by (1-((shield/max)*thisValue));-->
<ShieldRecoveryMult>0.25</ShieldRecoveryMult> <!-- MAX % at low health - in direct recovery, the shield recharge will be multiplied: recharge = recharge*thisValue;-->
<ShieldRechargePowerConsuption>10</ShieldRechargePowerConsuption> <!-- (when shield < 100%) per regen point -->
<ShieldFullPowerConsuption>1</ShieldFullPowerConsuption> <!-- (when shield == 100%) per regen point -->
<ShieldDockTransferLimit>0.25</ShieldDockTransferLimit> <!-- Up to which fill status a rail docked entity up in the chain (towards root) will take the hit (e.g. 0.25 means that a mothership (and docks inbetween) will take the shots of a turret or other rail dock as long as they have more than 25% of their max shields left -->
<PowerDivFactor>0.333</PowerDivFactor>
<PowerCeiling>2000000.0</PowerCeiling>
<PowerGrowth>1.000348</PowerGrowth>
<PowerLinearGrowth>25.0</PowerLinearGrowth>
<PowerRecoveryTime>1000</PowerRecoveryTime>
<PowerBaseCapacity>50000</PowerBaseCapacity>
<PowerTankCapacityLinear>1000</PowerTankCapacityLinear> <!-- multiplication per unit -->
<PowerTankCapacityPow>1.05</PowerTankCapacityPow> <!-- unitSize^x per unit -->
<TakeOffEffectPowerConsumptionMult>1</TakeOffEffectPowerConsumptionMult> <!-- multiplied by force -->
<EvadeEffectPowerConsumptionMult>1</EvadeEffectPowerConsumptionMult> <!-- multiplied by force -->
<PersonalSalvageBeamBonus>1.25</PersonalSalvageBeamBonus> <!-- bonus mult of raw resources when salvaging with handheld salvage beam (everything between whole numbers is chance (e.g. 1.25 give 25% chance of an extra raw yield) -->
<RailMassEnhancerFreeMass>50.0</RailMassEnhancerFreeMass> <!-- mass that is free to place without the need of a rail mass enhancer -->
<RailMassEnhancerMassPerEnhancer>5.0</RailMassEnhancerMassPerEnhancer> <!-- how much mass is free to place for each rail mass enhancer in the structure -->
<RailMassEnhancerPowerConsumedPerEnhancer>50.0</RailMassEnhancerPowerConsumedPerEnhancer> <!-- How much power per second is consumed my rail enhancer blocks -->
<RailMassEnhancerPercentCostPerMassAboveEnhancerProvided>0.05</RailMassEnhancerPercentCostPerMassAboveEnhancerProvided> <!-- how much % of mass speed (between 0 and 1) is subtracted for every one mass placed on a dock that is above the current mass limit (free blocks + enhancers) (e.g. at 0.1, for every block placed the speed is one percent slower)-->
<PlanetPowerBaseCapacity>500</PlanetPowerBaseCapacity>
<AsteroidPowerBaseCapacity>500</AsteroidPowerBaseCapacity>
<StructureHpBlockMultiplier>1.0</StructureHpBlockMultiplier> <!-- how much of the hp value is added to the systemHP -->
<HpDeductionLogOffset>-5</HpDeductionLogOffset>
<HpDeductionLogFactor>0.7</HpDeductionLogFactor> <!-- deducted hit points on damage: blockHP + HpDeductionLogFactor*(max(0, log10(maxHP)+HpDeductionLogOffset)) * blockHP -->
<ShipRebootTimeInSecPerMissingHpPercent>40.0</ShipRebootTimeInSecPerMissingHpPercent> <!-- on 0% hp, the full value in seconds is needed to reboot -->
<ShipRebootTimeMultiplierPerMass>0.0002</ShipRebootTimeMultiplierPerMass> <!-- secondsToReboot * (mass * ShipRebootTimeMultiplyerPerMass) -->
<ShipRebootTimeMinSec>30.0</ShipRebootTimeMinSec> <!-- Minimum time in secs a reboot will take -->
<ArmorHpAbsorbtion>0.5</ArmorHpAbsorbtion> <!-- absorbedDamageToArmorHP = ArmorHpAbsorbtion; How much damage of a shot can be absorbed to armorHP; this is a static value; set it to 0 if you want to use a dynamic variance instead with ArmorHpDamageThreshold-->
<ArmorHpAbsorbedDamageMultiplier>1.0</ArmorHpAbsorbedDamageMultiplier> <!-- How much absorbed damaged is deducted from armorHP -->
<ArmorHpBlockMultiplier>1.0</ArmorHpBlockMultiplier> <!-- how much of the armor value is added to the armorHP -->
<ArmorHpDamageThreshold>1.0</ArmorHpDamageThreshold> <!-- absorbedDamageToArmorHP = (ArmorHpDamageThreshold * [armorhp of the block]) * [current ArmorHp Left On Ship]; Note: this is not used as long as ArmorHpAbsorbtion != 0; This means, a ship wont take damage other than armorHP damage as long as a single shot isn't above the trheshold; -->
<AITurretMinOrientationSpeed>0.5</AITurretMinOrientationSpeed> <!-- Minimum turret orientation speed by mass used by AI (still depends on enhancer) -->
<AITurretMaxOrientationSpeed>3.5</AITurretMaxOrientationSpeed> <!-- Maximum turret orientation speed by mass used by AI (still depends on enhancer) -->
<AITurretOrientationSpeedDivByMass>50.0</AITurretOrientationSpeedDivByMass> <!-- speed = AITurretOrientationSpeedDivByMass / mass -->
<ExplosionShieldDamageBonus>0.0</ExplosionShieldDamageBonus> <!-- all explosions (missile/warhead/pulse) do [damage + damage * bonus] against shields-->
<ExplosionHullDamageBonus>0.0</ExplosionHullDamageBonus> <!-- all explosions (missile/warhead/pulse) do [damage + damage * bonus] against blocks (will also hurt armor more)-->
<VolumeMassMultiplier>0.01</VolumeMassMultiplier> <!-- how much of the volume of an item in an inventory/storage/cargo adds to the mass of a structure -->
</BasicValues>
</General>
</BlockBehavior>
```
22. This worked! Ok, so it seemed we were getting somewhere.
23. I then loaded a copy of the ENTIRE unchanged BlockBehaviorConfig.xml file from the "/data/config" folder, then changed the figures we need changed for our server, which includes some changes to settings for jump drives, just drive inhibitors, cargo, etc. I also cut out the settings for "StructureHpBlockMultiplier," since that seemed to be giving us trouble.
24. This worked! The server was running! So, I decided to check to ensure the settings were actually applied AND THEY WERE!
So, this seems to allow the server to boot now, however, I cannot explain the other two java errors which were extremely similar.
A. Where the "java.lang.NullPointerException" error was paired with the "java.io.FileNotFoundException:" error for the revertBlockBehaviorConfig.xml.
B. Where the "ava.lang.IllegalArgumentException: No enum constant obfuscated.YF.STATUS_ARMOR_HP_ABSORBTION_BONUS" error was paired with the revertBlockBehaviorConfig.xml error.