| 181 | } |
| 182 | |
| 183 | NpcVariant NpcDatabase::readNpcVariant(ByteArray const& data, NetCompatibilityRules rules) const { |
| 184 | DataStreamBuffer ds(data); |
| 185 | ds.setStreamCompatibilityVersion(rules); |
| 186 | |
| 187 | NpcVariant variant; |
| 188 | |
| 189 | ds.read(variant.species); |
| 190 | ds.read(variant.typeName); |
| 191 | ds.read(variant.level); |
| 192 | ds.read(variant.seed); |
| 193 | ds.read(variant.overrides); |
| 194 | |
| 195 | auto config = buildConfig(variant.typeName, variant.overrides); |
| 196 | |
| 197 | variant.scripts = jsonToStringList(config.get("scripts")); |
| 198 | variant.scriptConfig = config.get("scriptConfig"); |
| 199 | |
| 200 | ds.read(variant.initialScriptDelta); |
| 201 | ds.read(variant.humanoidIdentity); |
| 202 | |
| 203 | auto speciesDefinition = Root::singleton().speciesDatabase()->species(variant.species); |
| 204 | if (config.contains("humanoidConfig")) |
| 205 | variant.humanoidConfig = Root::singleton().assets()->json(config.getString("humanoidConfig")); |
| 206 | else |
| 207 | variant.humanoidConfig = speciesDefinition->humanoidConfig(); |
| 208 | |
| 209 | variant.movementParameters = |
| 210 | jsonMerge(variant.humanoidConfig.get("movementParameters"), config.get("movementParameters", {})); |
| 211 | variant.statusControllerSettings = config.get("statusControllerSettings"); |
| 212 | |
| 213 | auto functionDatabase = Root::singleton().functionDatabase(); |
| 214 | float powerMultiplierModifier = |
| 215 | functionDatabase->function("npcLevelPowerMultiplierModifier")->evaluate(variant.level); |
| 216 | float protectionMultiplier = functionDatabase->function("npcLevelProtectionMultiplier")->evaluate(variant.level); |
| 217 | float maxHealthMultiplier = functionDatabase->function("npcLevelHealthMultiplier")->evaluate(variant.level); |
| 218 | float maxEnergyMultiplier = functionDatabase->function("npcLevelEnergyMultiplier")->evaluate(variant.level); |
| 219 | |
| 220 | variant.innateStatusEffects = |
| 221 | config.get("innateStatusEffects", JsonArray()).toArray().transformed(jsonToPersistentStatusEffect); |
| 222 | variant.innateStatusEffects.append(StatModifier(StatValueModifier{"powerMultiplier", powerMultiplierModifier})); |
| 223 | variant.innateStatusEffects.append(StatModifier(StatBaseMultiplier{"protection", protectionMultiplier})); |
| 224 | variant.innateStatusEffects.append(StatModifier(StatBaseMultiplier{"maxHealth", maxHealthMultiplier})); |
| 225 | variant.innateStatusEffects.append(StatModifier(StatBaseMultiplier{"maxEnergy", maxEnergyMultiplier})); |
| 226 | |
| 227 | variant.touchDamageConfig = config.get("touchDamage", {}); |
| 228 | |
| 229 | ds.readMapContainer(variant.items); |
| 230 | |
| 231 | variant.disableWornArmor = config.getBool("disableWornArmor", true); |
| 232 | variant.dropPools = jsonToStringList(config.get("dropPools", JsonArray{})); |
| 233 | |
| 234 | ds.read(variant.persistent); |
| 235 | ds.read(variant.keepAlive); |
| 236 | ds.read(variant.damageTeam); |
| 237 | ds.read(variant.damageTeamType); |
| 238 | |
| 239 | variant.nametagColor = jsonToVec3B(config.get("nametagColor", JsonArray{255, 255, 255})); |
| 240 |
nothing calls this directly
no test coverage detected