private void UpdateItem(ItemDefinition definition, JSONObject item) { definition.shortname = item.GetString("shortname", "unnamed"); if (!_stackSizes) { definition.stackable = item.GetInt("stackable", 1); } definition.maxDraggable = item.GetInt("maxDraggable", 0); definition.category = (ItemCategory)Enum.Parse(typeof(ItemCategory), item.GetString("category", "Weapon")); var condition = item.GetObject("condition"); definition.condition.enabled = condition.GetBoolean("enabled", false); definition.condition.max = condition.GetFloat("max", 0); definition.condition.repairable = condition.GetBoolean("repairable", false); definition.rarity = GetRarity(item); definition.Parent = GetItem(item, "Parent"); var modules = item.GetArray("modules").Select(m => m.Obj); foreach (var mod in modules) { var typeName = mod.GetString("type", ""); //Puts("Item: {0} - {1}", definition.shortname, typeName); if (typeName.Equals("ItemModConsume")) { var itemMod = definition.GetComponent <ItemModConsume>(); var itemEffects = itemMod.GetComponent <ItemModConsumable>().effects; var effects = mod.GetArray("effects"); itemEffects.Clear(); foreach (var effect in effects) { itemEffects.Add(new ItemModConsumable.ConsumableEffect { type = (MetabolismAttribute.Type)Enum.Parse(typeof(MetabolismAttribute.Type), effect.Obj.GetString("type", "")), amount = effect.Obj.GetFloat("amount", 0), time = effect.Obj.GetFloat("time", 0) }); } } else if (typeName.Equals("ItemModContainer")) { var itemMod = definition.GetComponent <ItemModContainer>(); itemMod.capacity = mod.GetInt("capacity", 6); itemMod.maxStackSize = mod.GetInt("maxStackSize", 0); itemMod.openInDeployed = mod.GetBoolean("openInDeployed", true); itemMod.openInInventory = mod.GetBoolean("openInInventory", true); itemMod.defaultContents.Clear(); var defaultContents = mod.GetArray("defaultContents"); foreach (var content in defaultContents) { var itemDef = GetItem(content.Obj, "shortname"); if (itemDef == null) { continue; } itemMod.defaultContents.Add(new ItemAmount(itemDef, content.Obj.GetFloat("amount", 0))); } itemMod.onlyAllowedItemType = mod.GetValue("onlyAllowedItemType").Type == JSONValueType.Null ? null : GetItem(mod.GetString("onlyAllowedItemType", "unnamed")); } else if (typeName.Equals("ItemModBurnable")) { var itemMod = definition.GetComponent <ItemModBurnable>() ?? definition.gameObject.AddComponent <ItemModBurnable>(); itemMod.fuelAmount = mod.GetFloat("fuelAmount", 10f); itemMod.byproductAmount = mod.GetInt("byproductAmount", 1); itemMod.byproductChance = mod.GetFloat("byproductChance", 0.5f); itemMod.byproductItem = GetItem(mod, "byproductItem"); } else if (typeName.Equals("ItemModCookable")) { var itemMod = definition.GetComponent <ItemModCookable>() ?? definition.gameObject.AddComponent <ItemModCookable>(); itemMod.cookTime = mod.GetFloat("cookTime", 30f); itemMod.amountOfBecome = mod.GetInt("amountOfBecome", 1); itemMod.lowTemp = mod.GetInt("lowTemp", 0); itemMod.highTemp = mod.GetInt("highTemp", 0); itemMod.setCookingFlag = mod.GetBoolean("setCookingFlag", false); itemMod.becomeOnCooked = GetItem(mod, "becomeOnCooked"); } else if (typeName.Equals("ItemModReveal")) { var itemMod = definition.GetComponent <ItemModReveal>(); itemMod.revealedItemAmount = mod.GetInt("revealedItemAmount", 1); itemMod.numForReveal = mod.GetInt("numForReveal", 1); itemMod.revealedItemOverride = GetItem(mod, "revealedItemOverride"); } else if (typeName.Equals("ItemModUpgrade")) { var itemMod = definition.GetComponent <ItemModUpgrade>(); itemMod.numForUpgrade = mod.GetInt("numForUpgrade", 10); itemMod.upgradeSuccessChance = mod.GetFloat("upgradeSuccessChance", 1f); itemMod.numToLoseOnFail = mod.GetInt("numToLoseOnFail", 2); itemMod.numUpgradedItem = mod.GetInt("numUpgradedItem", 1); itemMod.upgradedItem = GetItem(mod, "upgradedItem"); } else if (typeName.Equals("ItemModRecycleInto")) { var itemMod = definition.GetComponent <ItemModRecycleInto>(); itemMod.numRecycledItemMin = mod.GetInt("numRecycledItemMin", 1); itemMod.numRecycledItemMax = mod.GetInt("numRecycledItemMax", 1); itemMod.recycleIntoItem = GetItem(mod, "recycleIntoItem"); } else if (typeName.Equals("ItemModXPWhenUsed")) { var itemMod = definition.GetComponent <ItemModXPWhenUsed>(); itemMod.xpPerUnit = mod.GetFloat("xpPerUnit", 0); itemMod.unitSize = mod.GetInt("unitSize", 1); } else if (typeName.Equals("ItemModSwap")) { var itemMod = definition.GetComponent <ItemModSwap>(); itemMod.sendPlayerDropNotification = mod.GetBoolean("sendPlayerDropNotification", false); itemMod.sendPlayerPickupNotification = mod.GetBoolean("sendPlayerPickupNotification", false); var items = new List <ItemAmount>(); var becomeItems = mod.GetArray("becomeItem"); foreach (var content in becomeItems) { var itemDef = GetItem(content.Obj, "shortname"); if (itemDef == null) { continue; } items.Add(new ItemAmount(itemDef, content.Obj.GetFloat("amount", 0))); } itemMod.becomeItem = items.ToArray(); } else if (typeName.Equals("ItemModProjectile") || typeName.Equals("ItemModProjectileSpawn")) { var itemMod = definition.GetComponent <ItemModProjectile>(); var projectile = itemMod.projectileObject.Get().GetComponent <Projectile>(); projectile.drag = mod.GetFloat("drag", 0); projectile.thickness = mod.GetFloat("thickness", 0); projectile.remainInWorld = mod.GetBoolean("remainInWorld", false); projectile.breakProbability = mod.GetFloat("breakProbability", 0); projectile.stickProbability = mod.GetFloat("stickProbability", 1f); projectile.ricochetChance = mod.GetFloat("ricochetChance", 0); projectile.penetrationPower = mod.GetFloat("penetrationPower", 1f); UpdateDamageTypes(mod.GetArray("damageTypes"), projectile.damageTypes); var spawn = itemMod as ItemModProjectileSpawn; if (spawn != null) { spawn.createOnImpactChance = mod.GetFloat("createOnImpactChance", 0); spawn.spreadAngle = mod.GetFloat("spreadAngle", 30); } var projMods = mod.GetArray("mods"); var i = 0; foreach (var projMod in projMods) { var curMod = (ItemModProjectileRadialDamage)itemMod.mods[i++]; curMod.radius = projMod.Obj.GetFloat("radius", 0); curMod.damage.amount = projMod.Obj.GetObject("damage").GetFloat("amount", 0); curMod.damage.type = (DamageType)Enum.Parse(typeof(DamageType), projMod.Obj.GetObject("damage").GetString("type", "")); } } else if (typeName.EndsWith("TimedExplosive") || typeName.EndsWith("FlameExplosive") || typeName.EndsWith("SupplySignal") || typeName.EndsWith("SurveyCharge")) { TimedExplosive timedExplosive; if (typeName.StartsWith("ItemModProjectile")) { var itemMod = definition.GetComponent <ItemModProjectile>(); timedExplosive = itemMod.projectileObject.Get().GetComponent <TimedExplosive>(); } else if (typeName.StartsWith("ItemModEntity")) { var itemMod = definition.GetComponent <ItemModEntity>(); timedExplosive = itemMod.entityPrefab.Get().GetComponent <ThrownWeapon>().prefabToThrow.Get().GetComponent <TimedExplosive>(); } else { continue; } var flameExplosive = timedExplosive as FlameExplosive; if (flameExplosive != null) { flameExplosive.maxVelocity = mod.GetFloat("maxVelocity", 5); flameExplosive.minVelocity = mod.GetFloat("minVelocity", 2); flameExplosive.numToCreate = mod.GetFloat("numToCreate", 10); flameExplosive.spreadAngle = mod.GetFloat("spreadAngle", 90); } else { var dudTimedExplosive = timedExplosive as DudTimedExplosive; if (dudTimedExplosive != null) { dudTimedExplosive.dudChance = mod.GetFloat("dudChance", 0.3f); } } timedExplosive.canStick = mod.GetBoolean("canStick", false); timedExplosive.minExplosionRadius = mod.GetFloat("minExplosionRadius", 0); timedExplosive.explosionRadius = mod.GetFloat("explosionRadius", 10); timedExplosive.timerAmountMax = mod.GetFloat("timerAmountMax", 20); timedExplosive.timerAmountMin = mod.GetFloat("timerAmountMin", 10); UpdateDamageTypes(mod.GetArray("damageTypes"), timedExplosive.damageTypes); } else if (typeName.Equals("ItemModProjectileServerProjectile")) { var itemMod = definition.GetComponent <ItemModProjectile>(); var projectile = itemMod.projectileObject.Get().GetComponent <ServerProjectile>(); projectile.drag = mod.GetFloat("drag", 0); projectile.gravityModifier = mod.GetFloat("gravityModifier", 0); projectile.speed = mod.GetFloat("speed", 0); } else if (typeName.Equals("ItemModEntityBaseMelee")) { var itemMod = definition.GetComponent <ItemModEntity>(); var baseMelee = itemMod.entityPrefab.Get().GetComponent <BaseMelee>(); baseMelee.attackRadius = mod.GetFloat("attackRadius", 0.3f); baseMelee.isAutomatic = mod.GetBoolean("isAutomatic", true); baseMelee.maxDistance = mod.GetFloat("maxDistance", 1.5f); baseMelee.repeatDelay = mod.GetFloat("repeatDelay", 1.0f); var gathering = mod.GetObject("gathering"); UpdateGatherPropertyEntry(baseMelee.gathering.Ore, gathering.GetObject("Ore")); UpdateGatherPropertyEntry(baseMelee.gathering.Flesh, gathering.GetObject("Flesh")); UpdateGatherPropertyEntry(baseMelee.gathering.Tree, gathering.GetObject("Tree")); UpdateDamageTypes(mod.GetArray("damageTypes"), baseMelee.damageTypes); } else if (typeName.Equals("ItemModEntityBaseProjectile")) { var itemMod = definition.GetComponent <ItemModEntity>(); var baseProjectile = itemMod.entityPrefab.Get().GetComponent <BaseProjectile>(); baseProjectile.primaryMagazine.contents = mod.GetInt("contents", 4); baseProjectile.primaryMagazine.ammoType = GetItem(mod, "ammoType"); baseProjectile.primaryMagazine.definition.builtInSize = mod.GetInt("builtInSize", 30); //baseProjectile.primaryMagazine.definition.ammoTypes = FromJsonString<AmmoTypes>(mod.GetString("ammoTypes")); } else if (typeName.Equals("ItemModWearable")) { var itemMod = definition.GetComponent <ItemModWearable>(); itemMod.targetWearable.occupationOver = GetOccupationSlot(mod.GetObject("targetWearable").GetValue("occupationOver")); itemMod.targetWearable.occupationUnder = GetOccupationSlot(mod.GetObject("targetWearable").GetValue("occupationUnder")); if (itemMod?.protectionProperties != null) { var protectionObj = mod.GetObject("protection"); var entry = itemMod.protectionProperties; entry.density = protectionObj.GetFloat("density", 1f); var amounts = protectionObj.GetObject("amounts"); foreach (var amount in amounts) { entry.amounts[(int)Enum.Parse(typeof(DamageType), amount.Key)] = (float)amount.Value.Number; } } if (itemMod?.armorProperties != null) { itemMod.armorProperties.area = (HitArea)Enum.Parse(typeof(HitAreaUnity), mod.GetString("armor"), true); } } else if (typeName.Equals("ItemModAlterCondition")) { var itemMod = definition.GetComponentsInChildren <ItemModAlterCondition>(true); itemMod[0].conditionChange = mod.GetFloat("conditionChange", 0); } else if (typeName.Equals("ItemModConditionHasFlag") || typeName.Equals("ItemModCycle") || typeName.Equals("ItemModConditionContainerFlag") || typeName.Equals("ItemModSwitchFlag") || typeName.Equals("ItemModUseContent") || typeName.Equals("ItemModConditionHasContents")) { continue; } else { Puts("Unknown type: {0}", typeName); } } }