public GameObject CreatePrefab() { string id = "BeanPlant"; string name = STRINGS.CREATURES.SPECIES.BEAN_PLANT.NAME; string desc = STRINGS.CREATURES.SPECIES.BEAN_PLANT.DESC; float mass = 2f; KAnimFile anim = Assets.GetAnim("beanplant_kanim"); string initialAnim = "idle_empty"; EffectorValues tIER = DECOR.BONUS.TIER1; GameObject gameObject = EntityTemplates.CreatePlacedEntity(id, name, desc, mass, anim, initialAnim, Grid.SceneLayer.BuildingFront, 1, 2, tIER, default(EffectorValues), SimHashes.Creature, null, 258.15f); EntityTemplates.ExtendEntityToBasicPlant(gameObject, 198.15f, 248.15f, 273.15f, 323.15f, null, true, 0f, 0.15f, "BeanPlantSeed", true, true, true, true, 2400f); EntityTemplates.ExtendPlantToIrrigated(gameObject, new PlantElementAbsorber.ConsumeInfo[1] { new PlantElementAbsorber.ConsumeInfo { tag = SimHashes.Ethanol.CreateTag(), massConsumptionRate = 0.0333333351f } }); EntityTemplates.ExtendPlantToFertilizable(gameObject, new PlantElementAbsorber.ConsumeInfo[1] { new PlantElementAbsorber.ConsumeInfo { tag = SimHashes.Dirt.CreateTag(), massConsumptionRate = 0.008333334f } }); PressureVulnerable pressureVulnerable = gameObject.AddOrGet <PressureVulnerable>(); PressureVulnerable pressureVulnerable2 = pressureVulnerable; mass = 0.025f; float pressureLethalLow = 0f; SimHashes[] safeAtmospheres = new SimHashes[1] { SimHashes.CarbonDioxide }; pressureVulnerable2.Configure(mass, pressureLethalLow, 10f, 30f, safeAtmospheres); UprootedMonitor component = gameObject.GetComponent <UprootedMonitor>(); component.monitorCell = new CellOffset(0, -1); gameObject.AddOrGet <StandardCropPlant>(); GameObject plant = gameObject; SeedProducer.ProductionType productionType = SeedProducer.ProductionType.Harvest; initialAnim = "BeanPlantSeed"; desc = STRINGS.CREATURES.SPECIES.SEEDS.BEAN_PLANT.NAME; name = STRINGS.CREATURES.SPECIES.SEEDS.BEAN_PLANT.DESC; anim = Assets.GetAnim("seed_beanplant_kanim"); List <Tag> list = new List <Tag>(); list.Add(GameTags.CropSeed); list = list; GameObject gameObject2 = EntityTemplates.CreateAndRegisterSeedForPlant(plant, productionType, initialAnim, desc, name, anim, "object", 1, list, SingleEntityReceptacle.ReceptacleDirection.Top, default(Tag), 4, STRINGS.CREATURES.SPECIES.BEAN_PLANT.DOMESTICATEDDESC, EntityTemplates.CollisionShape.RECTANGLE, 0.6f, 0.3f, null, string.Empty, false); EntityTemplates.ExtendEntityToFood(gameObject2, FOOD.FOOD_TYPES.BEAN); EntityTemplates.CreateAndRegisterPreviewForPlant(gameObject2, "BeanPlant_preview", Assets.GetAnim("beanplant_kanim"), "place", 1, 2); return(gameObject); }
public bool TestSuitableGround(int cell) { if (!Grid.IsValidCell(cell)) { return(false); } int num = (Direction != SingleEntityReceptacle.ReceptacleDirection.Bottom) ? Grid.CellBelow(cell) : Grid.CellAbove(cell); if (!Grid.IsValidCell(num)) { return(false); } if (Grid.Foundation[num]) { return(false); } if (Grid.Element[num].hardness >= 150) { return(false); } if (replantGroundTag.IsValid && !Grid.Element[num].HasTag(replantGroundTag)) { return(false); } GameObject prefab = Assets.GetPrefab(PlantID); EntombVulnerable component = prefab.GetComponent <EntombVulnerable>(); if ((Object)component != (Object)null && !component.IsCellSafe(cell)) { return(false); } DrowningMonitor component2 = prefab.GetComponent <DrowningMonitor>(); if ((Object)component2 != (Object)null && !component2.IsCellSafe(cell)) { return(false); } TemperatureVulnerable component3 = prefab.GetComponent <TemperatureVulnerable>(); if ((Object)component3 != (Object)null && !component3.IsCellSafe(cell)) { return(false); } UprootedMonitor component4 = prefab.GetComponent <UprootedMonitor>(); if ((Object)component4 != (Object)null && !component4.IsCellSafe(cell)) { return(false); } OccupyArea component5 = prefab.GetComponent <OccupyArea>(); if ((Object)component5 != (Object)null && !component5.CanOccupyArea(cell, ObjectLayer.Building)) { return(false); } return(true); }
public override void InitializeStates(out BaseState defaultState) { serializable = true; defaultState = Alive; var plantname = CREATURES.STATUSITEMS.DEAD.NAME; var tooltip = CREATURES.STATUSITEMS.DEAD.TOOLTIP; var main = Db.Get().StatusItemCategories.Main; Dead .ToggleStatusItem(plantname, tooltip, string.Empty, StatusItem.IconType.Info, 0, false, OverlayModes.None.ID, 0, null, null, main) .Enter(smi => { if (!UprootedMonitor.IsObjectUprooted(masterTarget.Get(smi))) { smi.master.gameObject.AddOrGet <Notifier>().Add(smi.master.CreateDeathNotification(), string.Empty); } GameUtil.KInstantiate(Assets.GetPrefab(EffectConfigs.PlantDeathId), smi.master.transform.GetPosition(), Grid.SceneLayer.FXFront).SetActive(true); smi.master.Trigger((int)GameHashes.Died); smi.master.GetComponent <KBatchedAnimController>().StopAndClear(); Destroy(smi.master.GetComponent <KBatchedAnimController>()); smi.Schedule(0.5f, smi.master.DestroySelf); }); Alive .InitializeStates(masterTarget, Dead) .DefaultState(Alive.Closed); Alive.Closed .PlayAnim("close") .Update("closed", (smi, dt) => { AbsorbHeat(smi, dt); if (smi.master._kjConsumed > smi.master._openEnergyThreshold) { smi.GoTo(Alive.Open); } }, UpdateRate.SIM_1000ms); Alive.Open.PlayAnim("open", KAnim.PlayMode.Once) .Enter(smi => smi.master._lightSource.enabled = true) .Update("open", (smi, dt) => { AbsorbHeat(smi, dt); smi.master._kjConsumed -= smi.master._lightKjConsumptionRate; if (smi.master._kjConsumed < smi.master._lightKjConsumptionRate) { smi.GoTo(Alive.Closed); } }, UpdateRate.SIM_1000ms) .Exit(smi => smi.master._lightSource.enabled = false); }
public GameObject CreatePrefab() { string id = "ForestTree"; string name = STRINGS.CREATURES.SPECIES.WOOD_TREE.NAME; string desc = STRINGS.CREATURES.SPECIES.WOOD_TREE.DESC; float mass = 2f; KAnimFile anim = Assets.GetAnim("tree_kanim"); string initialAnim = "idle_empty"; EffectorValues tIER = DECOR.BONUS.TIER1; List <Tag> additionalTags = new List <Tag>(); GameObject gameObject = EntityTemplates.CreatePlacedEntity(id, name, desc, mass, anim, initialAnim, Grid.SceneLayer.Building, 1, 2, tIER, default(EffectorValues), SimHashes.Creature, additionalTags, 298.15f); EntityTemplates.ExtendEntityToBasicPlant(gameObject, 258.15f, 288.15f, 313.15f, 448.15f, null, true, 0f, 0.15f, "WoodLog", true, true, true, false, 2400f); gameObject.AddOrGet <BuddingTrunk>(); gameObject.UpdateComponentRequirement <Harvestable>(false); Tag tag = ElementLoader.FindElementByHash(SimHashes.DirtyWater).tag; EntityTemplates.ExtendPlantToIrrigated(gameObject, new PlantElementAbsorber.ConsumeInfo[1] { new PlantElementAbsorber.ConsumeInfo { tag = tag, massConsumptionRate = 0.116666667f } }); EntityTemplates.ExtendPlantToFertilizable(gameObject, new PlantElementAbsorber.ConsumeInfo[1] { new PlantElementAbsorber.ConsumeInfo { tag = GameTags.Dirt, massConsumptionRate = 0.0166666675f } }); gameObject.AddComponent <StandardCropPlant>(); UprootedMonitor component = gameObject.GetComponent <UprootedMonitor>(); component.monitorCell = new CellOffset(0, -1); BuddingTrunk buddingTrunk = gameObject.AddOrGet <BuddingTrunk>(); buddingTrunk.budPrefabID = "ForestTreeBranch"; GameObject plant = gameObject; SeedProducer.ProductionType productionType = SeedProducer.ProductionType.Hidden; initialAnim = "ForestTreeSeed"; desc = STRINGS.CREATURES.SPECIES.SEEDS.WOOD_TREE.NAME; name = STRINGS.CREATURES.SPECIES.SEEDS.WOOD_TREE.DESC; anim = Assets.GetAnim("seed_tree_kanim"); additionalTags = new List <Tag>(); additionalTags.Add(GameTags.CropSeed); additionalTags = additionalTags; GameObject seed = EntityTemplates.CreateAndRegisterSeedForPlant(plant, productionType, initialAnim, desc, name, anim, "object", 1, additionalTags, SingleEntityReceptacle.ReceptacleDirection.Top, default(Tag), 4, STRINGS.CREATURES.SPECIES.WOOD_TREE.DOMESTICATEDDESC, EntityTemplates.CollisionShape.CIRCLE, 0.3f, 0.3f, null, string.Empty, false); EntityTemplates.CreateAndRegisterPreviewForPlant(seed, "ForestTree_preview", Assets.GetAnim("tree_kanim"), "place", 3, 3); return(gameObject); }
public override void InitializeStates(out BaseState default_state) { serializable = true; default_state = alive; string plantname = CREATURES.STATUSITEMS.DEAD.NAME; string tooltip = CREATURES.STATUSITEMS.DEAD.TOOLTIP; StatusItemCategory main = Db.Get().StatusItemCategories.Main; dead.ToggleStatusItem(plantname, tooltip, string.Empty, StatusItem.IconType.Info, 0, false, SimViewMode.None, 0, null, null, main) .Enter(smi => { if (smi.master.growing.Replanted && !UprootedMonitor.IsObjectUprooted(masterTarget.Get(smi))) { smi.master.gameObject.AddOrGet <Notifier>().Add(smi.master.CreateDeathNotification(), string.Empty); } GameUtil.KInstantiate(Assets.GetPrefab(EffectConfigs.PlantDeathId), smi.master.transform.GetPosition(), Grid.SceneLayer.FXFront).SetActive(true); smi.master.Trigger((int)GameHashes.Died); smi.master.GetComponent <KBatchedAnimController>().StopAndClear(); Destroy(smi.master.GetComponent <KBatchedAnimController>()); smi.Schedule(0.5f, smi.master.DestroySelf); }); alive .InitializeStates(masterTarget, dead) .DefaultState(alive.seed_grow).ToggleComponent <Growing>(); alive.seed_grow .QueueAnim("seed_grow") .OnAnimQueueComplete(alive.idle); alive.idle .Enter(smi => smi.master.elementConsumer.EnableConsumption(true)) .EventTransition(GameHashes.Wilt, alive.wilting_pre, smi => smi.master.wiltCondition.IsWilting()) .EventTransition(GameHashes.Grow, alive.pre_fruiting, smi => smi.master.growing.ReachedNextHarvest()) .PlayAnim("idle_loop", KAnim.PlayMode.Loop) .Exit(smi => smi.master.elementConsumer.EnableConsumption(false)); alive.pre_fruiting .PlayAnim("grow", KAnim.PlayMode.Once) .EventTransition(GameHashes.AnimQueueComplete, alive.fruiting); alive.fruiting_lost .Enter(smi => smi.master.harvestable.SetCanBeHarvested(false)) .GoTo(alive.idle); alive.wilting_pre .QueueAnim("wilt_pre") .OnAnimQueueComplete(alive.wilting); alive.wilting .PlayAnim("idle_wilt_loop", KAnim.PlayMode.Loop) .EventTransition(GameHashes.WiltRecover, alive.idle, smi => !smi.master.wiltCondition.IsWilting()) .EventTransition(GameHashes.Harvest, alive.harvest); alive.fruiting .DefaultState(alive.fruiting.fruiting_idle) .EventTransition(GameHashes.Wilt, alive.wilting_pre) .EventTransition(GameHashes.Harvest, alive.harvest) .EventTransition(GameHashes.Grow, alive.fruiting_lost, smi => !smi.master.growing.ReachedNextHarvest()); alive.fruiting.fruiting_idle.PlayAnim("idle_bloom_loop", KAnim.PlayMode.Loop) .Enter(smi => smi.master.harvestable.SetCanBeHarvested(true)) .Enter(smi => smi.master.elementConsumer.EnableConsumption(true)) .Enter(smi => smi.master.elementEmitter.SetEmitting(true)) .Update("fruiting_idle", (smi, dt) => { if (!smi.IsOld()) { return; } smi.GoTo(alive.fruiting.fruiting_old); }, UpdateRate.SIM_4000ms) .Exit(smi => smi.master.elementEmitter.SetEmitting(false)) .Exit(smi => smi.master.elementConsumer.EnableConsumption(false)); alive.fruiting.fruiting_old .PlayAnim("wilt", KAnim.PlayMode.Loop) .Enter(smi => smi.master.harvestable.SetCanBeHarvested(true)) .Update("fruiting_old", (smi, dt) => { if (smi.IsOld()) { return; } smi.GoTo(alive.fruiting.fruiting_idle); }, UpdateRate.SIM_4000ms); alive.harvest .PlayAnim("harvest", KAnim.PlayMode.Once) .Enter(smi => { if (GameScheduler.Instance != null && smi.master != null) { GameScheduler.Instance.Schedule("SpawnFruit", 0.2f, smi.master.crop.SpawnFruit); } smi.master.harvestable.SetCanBeHarvested(false); }) .OnAnimQueueComplete(alive.idle); }
}; //wilt1, grow_seed public static void ProcessPlant(GameObject plant) { PlantData setting = CustomizePlantsState.StateManager.State.PlantSettings?.FirstOrDefault(t => t.id == plant.name); if (setting == null) { return; } #region decor plant fixes if (setting.fruitId != null) //decor plant fixes { PrickleGrass grass = plant.GetComponent <PrickleGrass>(); if (grass != null || plant.name == ColdBreatherConfig.ID || plant.name == EvilFlowerConfig.ID) { UnityEngine.Object.DestroyImmediate(grass); //what happens if this is null? plant.AddOrGet <StandardCropPlant>(); KPrefabID prefab = plant.GetComponent <KPrefabID>(); prefab.prefabInitFn += (inst => { StandardCropPlant stdcrop2 = inst.GetComponent <StandardCropPlant>(); stdcrop2.anims = PlantHelper.DecorAnim; }); //KBatchedAnimController kbatchedAnimController = plant.AddOrGet<KBatchedAnimController>(); //kbatchedAnimController.AnimFiles = new KAnimFile[1] //{ // Assets.GetAnim("bristleblossom_kanim") //}; //kbatchedAnimController.initialAnim = "idle_empty"; } SeedProducer seed = plant.GetComponent <SeedProducer>(); if (seed != null) { seed.seedInfo.productionType = SeedProducer.ProductionType.Harvest; seed.seedInfo.newSeedsProduced = 1; } } #endregion #region fruitId if (setting.fruitId != null || setting.fruit_grow_time != null || setting.fruit_amount != null) //actual setting fruit { Crop crop = plant.AddOrGet <Crop>(); Crop.CropVal cropval = crop.cropVal; //this is a copy if (setting.fruitId != null) { cropval.cropId = setting.fruitId; } if (cropval.cropId == "") { cropval.cropId = "WoodLog"; } if (setting.fruit_grow_time != null) { cropval.cropDuration = (float)setting.fruit_grow_time; } if (cropval.cropDuration < 1f) { cropval.cropDuration = 1f; } if (setting.fruit_amount != null) { cropval.numProduced = (int)setting.fruit_amount; } if (cropval.numProduced < 1) { cropval.numProduced = 1; } crop.Configure(cropval); KPrefabID prefab = plant.GetComponent <KPrefabID>(); GeneratedBuildings.RegisterWithOverlay(OverlayScreen.HarvestableIDs, prefab.PrefabID().ToString()); Growing growing = plant.AddOrGet <Growing>(); growing.growthTime = cropval.cropDuration; if (setting.id != ForestTreeConfig.ID) // don't harvest arbor trees directly { plant.AddOrGet <Harvestable>(); } plant.AddOrGet <HarvestDesignatable>(); plant.AddOrGet <StandardCropPlant>(); } #endregion #region irrigation if (setting.irrigation != null) { RemoveIrrigation(plant); List <PlantElementAbsorber.ConsumeInfo> irrigation = new List <PlantElementAbsorber.ConsumeInfo>(3); List <PlantElementAbsorber.ConsumeInfo> fertilization = new List <PlantElementAbsorber.ConsumeInfo>(3); foreach (KeyValuePair <string, float> entry in setting.irrigation) { if (GameTags.LiquidElements.Contains(entry.Key)) { irrigation.Add(new PlantElementAbsorber.ConsumeInfo(entry.Key, entry.Value / 600f)); } else if (GameTags.SolidElements.Contains(entry.Key)) { fertilization.Add(new PlantElementAbsorber.ConsumeInfo(entry.Key, entry.Value / 600f)); } else { Debug.Log(ToDialog("Irrigation for " + setting.id + " defines bad element: " + entry.Key)); } } if (irrigation.Count > 0) { EntityTemplates.ExtendPlantToIrrigated(plant, irrigation.ToArray()); } if (fertilization.Count > 0) { EntityTemplates.ExtendPlantToFertilizable(plant, fertilization.ToArray()); } } #endregion #region illumination if (setting.illumination != null) { IlluminationVulnerable illumination = plant.GetComponent <IlluminationVulnerable>(); CropSleepingMonitor.Def cropSleep = plant.GetDef <CropSleepingMonitor.Def>(); if (setting.illumination == 0f) { if (illumination != null) { UnityEngine.Object.DestroyImmediate(illumination); } if (cropSleep != null) { FumLib.FumTools.RemoveDef(plant, cropSleep); } } else if (setting.illumination < 0f) { if (illumination == null) { illumination = plant.AddOrGet <IlluminationVulnerable>(); } if (cropSleep != null) { FumLib.FumTools.RemoveDef(plant, cropSleep); } illumination.SetPrefersDarkness(true); } else if (setting.illumination == 1f) { if (illumination == null) { illumination = plant.AddOrGet <IlluminationVulnerable>(); } if (cropSleep != null) { FumLib.FumTools.RemoveDef(plant, cropSleep); } illumination.SetPrefersDarkness(false); } else { if (illumination != null) { UnityEngine.Object.DestroyImmediate(illumination); } if (cropSleep == null) { cropSleep = plant.AddOrGetDef <CropSleepingMonitor.Def>(); } cropSleep.lightIntensityThreshold = (float)setting.illumination; cropSleep.prefersDarkness = false; } } #endregion #region safe_elements if (setting.safe_elements != null) { plant.GetComponent <KPrefabID>().prefabInitFn += (inst => { PressureVulnerable pressure = inst.GetComponent <PressureVulnerable>(); pressure.safe_atmospheres.Clear(); foreach (string safe_element in setting.safe_elements) { pressure.safe_atmospheres.Add(ElementLoader.FindElementByName(safe_element)); } }); } #endregion #region pressure if (setting.pressures != null) { PressureVulnerable pressure = plant.AddOrGet <PressureVulnerable>(); pressure.pressureLethal_Low = 0f; pressure.pressureWarning_Low = 0f; pressure.pressureWarning_High = float.MaxValue; pressure.pressureLethal_High = float.MaxValue; pressure.pressure_sensitive = false; for (int i = 0; i < setting.pressures.Length; i++) { switch (i) { case 0: pressure.pressureLethal_Low = setting.pressures[i]; pressure.pressure_sensitive = true; break; case 1: pressure.pressureWarning_Low = setting.pressures[i]; break; case 2: pressure.pressureWarning_High = setting.pressures[i]; break; case 3: pressure.pressureLethal_High = setting.pressures[i]; break; } } } #endregion #region decor try { if (setting.decor_value != null) { plant.GetComponent <DecorProvider>().baseDecor = (float)setting.decor_value; } if (setting.decor_radius != null) { plant.GetComponent <DecorProvider>().baseRadius = (float)setting.decor_radius; } } catch (Exception) { Debug.LogWarning("[CustomizePlants] For some weird reason " + plant.name + " has no DecorProvider."); } #endregion #region temperatures if (setting.temperatures != null) { TemperatureVulnerable temperature = plant.AddOrGet <TemperatureVulnerable>(); for (int i = 0; i < setting.temperatures.Length; i++) { switch (i) { case 0: temperature.internalTemperatureLethal_Low = setting.temperatures[i]; break; case 1: temperature.internalTemperatureWarning_Low = setting.temperatures[i]; break; case 2: temperature.internalTemperatureWarning_High = setting.temperatures[i]; break; case 3: temperature.internalTemperatureLethal_High = setting.temperatures[i]; break; } } } #endregion #region submerged_threshold if (setting.submerged_threshold != null) { DrowningMonitor drowning = plant.AddOrGet <DrowningMonitor>(); if (setting.submerged_threshold == 0f) //doesn't care about water { UnityEngine.Object.DestroyImmediate(drowning); } else if (setting.submerged_threshold < 0f) //needs water { drowning.livesUnderWater = true; drowning.canDrownToDeath = false; } else //if(setting.submerged_threshold > 0f) //hates water { drowning.livesUnderWater = false; drowning.canDrownToDeath = false; } } #endregion #region can_tinker if (setting.can_tinker != null) { if (setting.can_tinker == true) { Tinkerable.MakeFarmTinkerable(plant); } } #endregion #region require_solid_tile if (setting.require_solid_tile != null) { UprootedMonitor uproot = plant.AddOrGet <UprootedMonitor>(); if (setting.require_solid_tile == false) { UnityEngine.Object.DestroyImmediate(uproot); } } #endregion #region max_age if (setting.max_age != null && plant.GetComponent <StandardCropPlant>() != null) //only if plant has fruit { Growing growing = plant.AddOrGet <Growing>(); if (setting.max_age <= 0) { growing.shouldGrowOld = false; } else { growing.shouldGrowOld = true; growing.maxAge = (float)setting.max_age; } } #endregion #region disease if (setting.disease != null || setting.disease_amount != null) { DiseaseDropper.Def def = plant.AddOrGetDef <DiseaseDropper.Def>(); if (setting.disease != null) { def.diseaseIdx = Db.Get().Diseases.GetIndex(setting.disease); } if (setting.disease_amount != null) { def.singleEmitQuantity = (int)setting.disease_amount; } if (def.diseaseIdx == byte.MaxValue || def.singleEmitQuantity == 0) { FumLib.FumTools.RemoveDef(plant, def); } } #endregion #region input_element if (setting.input_element != null) { ElementConsumer consumer = plant.AddOrGet <ElementConsumer>(); Element element = ElementLoader.FindElementByName(setting.input_element); if (element == null || element.IsSolid) //invalid element { Debug.Log(ToDialog("input_element is bad element: " + setting.input_element)); UnityEngine.Object.DestroyImmediate(consumer); } else if (setting.input_rate <= 0f) //delete consumer { UnityEngine.Object.DestroyImmediate(consumer); } else { consumer.configuration = ElementConsumer.Configuration.Element; consumer.consumptionRadius = 2; consumer.sampleCellOffset = new Vector3(0f, 0f); consumer.EnableConsumption(true); consumer.showInStatusPanel = true; consumer.storeOnConsume = false; //consumer deletes elements; output_element might overrides this consumer.consumptionRate = (float)setting.input_rate; consumer.elementToConsume = element.id; consumer.capacityKG = (float)setting.input_rate * 10; plant.AddOrGet <Storage>().capacityKg = consumer.capacityKG; plant.AddOrGet <SaltPlant>(); } } #endregion #region output_element if (setting.output_element != null) { ElementConsumer consumer = plant.GetComponent <ElementConsumer>(); ElementConverter converter = plant.AddOrGet <ElementConverter>(); Element element = ElementLoader.FindElementByName(setting.output_element); if (element == null) //invalid element { Debug.Log(ToDialog("output_element is bad element: " + setting.output_element)); UnityEngine.Object.DestroyImmediate(converter); } else if (setting.output_rate <= 0f) //delete converter { UnityEngine.Object.DestroyImmediate(converter); if (consumer != null) { consumer.storeOnConsume = false; } } else { if (consumer != null) //transform elements { consumer.storeOnConsume = true; converter.consumedElements = new ElementConverter.ConsumedElement[1] { new ElementConverter.ConsumedElement(consumer.elementToConsume.CreateTag(), consumer.consumptionRate) }; converter.OutputMultiplier = (float)setting.output_rate / consumer.consumptionRate; //Debug.Log("TAG is: " + consumer.elementToConsume.CreateTag().Name + " SimHash is: " + consumer.elementToConsume.ToString()); } else //create from nothing { converter.consumedElements = new ElementConverter.ConsumedElement[0]; converter.OutputMultiplier = 1f; } converter.outputElements = new ElementConverter.OutputElement[1] { new ElementConverter.OutputElement((float)setting.output_rate, element.id, 0f, true, false, 0f, 1f) }; plant.AddOrGet <Storage>(); plant.AddOrGet <SaltPlant>(); } } #endregion }
public GameObject CreatePrefab() { string id = "SaltPlant"; string name = STRINGS.CREATURES.SPECIES.SALTPLANT.NAME; string desc = STRINGS.CREATURES.SPECIES.SALTPLANT.DESC; float mass = 2f; KAnimFile anim = Assets.GetAnim("saltplant_kanim"); string initialAnim = "idle_empty"; EffectorValues tIER = DECOR.PENALTY.TIER1; List <Tag> list = new List <Tag>(); list.Add(GameTags.Hanging); list = list; GameObject gameObject = EntityTemplates.CreatePlacedEntity(id, name, desc, mass, anim, initialAnim, Grid.SceneLayer.BuildingFront, 1, 2, tIER, default(EffectorValues), SimHashes.Creature, list, 258.15f); EntityTemplates.MakeHangingOffsets(gameObject, 1, 2); GameObject template = gameObject; mass = 198.15f; float temperature_warning_low = 248.15f; float temperature_warning_high = 323.15f; float temperature_lethal_high = 393.15f; initialAnim = 381665462.ToString(); EntityTemplates.ExtendEntityToBasicPlant(template, mass, temperature_warning_low, temperature_warning_high, temperature_lethal_high, null, true, 0f, 0.15f, initialAnim, true, true, true, true, 2400f); gameObject.AddOrGet <SaltPlant>(); EntityTemplates.ExtendPlantToFertilizable(gameObject, new PlantElementAbsorber.ConsumeInfo[1] { new PlantElementAbsorber.ConsumeInfo { tag = SimHashes.Sand.CreateTag(), massConsumptionRate = 0.0116666667f } }); PressureVulnerable pressureVulnerable = gameObject.AddOrGet <PressureVulnerable>(); PressureVulnerable pressureVulnerable2 = pressureVulnerable; temperature_lethal_high = 0.025f; temperature_warning_high = 0f; SimHashes[] safeAtmospheres = new SimHashes[1] { SimHashes.ChlorineGas }; pressureVulnerable2.Configure(temperature_lethal_high, temperature_warning_high, 10f, 30f, safeAtmospheres); KPrefabID component = gameObject.GetComponent <KPrefabID>(); component.prefabInitFn += delegate(GameObject inst) { PressureVulnerable component3 = inst.GetComponent <PressureVulnerable>(); component3.safe_atmospheres.Add(ElementLoader.FindElementByHash(SimHashes.ChlorineGas)); }; Storage storage = gameObject.AddOrGet <Storage>(); storage.showInUI = false; storage.capacityKg = 1f; ElementConsumer elementConsumer = gameObject.AddOrGet <ElementConsumer>(); elementConsumer.showInStatusPanel = true; elementConsumer.showDescriptor = true; elementConsumer.storeOnConsume = false; elementConsumer.elementToConsume = SimHashes.ChlorineGas; elementConsumer.configuration = ElementConsumer.Configuration.Element; elementConsumer.consumptionRadius = 4; elementConsumer.sampleCellOffset = new Vector3(0f, -1f); elementConsumer.consumptionRate = 0.006f; UprootedMonitor component2 = gameObject.GetComponent <UprootedMonitor>(); component2.monitorCell = new CellOffset(0, 1); gameObject.AddOrGet <StandardCropPlant>(); template = gameObject; SeedProducer.ProductionType productionType = SeedProducer.ProductionType.Harvest; initialAnim = "SaltPlantSeed"; desc = STRINGS.CREATURES.SPECIES.SEEDS.SALTPLANT.NAME; name = STRINGS.CREATURES.SPECIES.SEEDS.SALTPLANT.DESC; anim = Assets.GetAnim("seed_saltplant_kanim"); list = new List <Tag>(); list.Add(GameTags.CropSeed); list = list; GameObject seed = EntityTemplates.CreateAndRegisterSeedForPlant(template, productionType, initialAnim, desc, name, anim, "object", 1, list, SingleEntityReceptacle.ReceptacleDirection.Bottom, default(Tag), 4, STRINGS.CREATURES.SPECIES.SALTPLANT.DOMESTICATEDDESC, EntityTemplates.CollisionShape.CIRCLE, 0.35f, 0.35f, null, string.Empty, false); GameObject template2 = EntityTemplates.CreateAndRegisterPreviewForPlant(seed, "SaltPlant_preview", Assets.GetAnim("saltplant_kanim"), "place", 1, 2); EntityTemplates.MakeHangingOffsets(template2, 1, 2); return(gameObject); }