예제 #1
0
        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);
                }
            }
        }