public static bool ShouldApply(this ReagentEffect effect, ReagentEffectArgs args, IRobustRandom?random = null) { if (random == null) { random = IoCManager.Resolve <IRobustRandom>(); } if (effect.Probability < 1.0f && !random.Prob(effect.Probability)) { return(false); } if (effect.Conditions != null) { foreach (var cond in effect.Conditions) { if (!cond.Condition(args)) { return(false); } } } return(true); }
public override void Effect(ReagentEffectArgs args) { var solution = args.Source; if (solution == null) { return; } var deltaT = GetDeltaT(solution); if (_scaled) { deltaT = deltaT * (float)args.Quantity; } if (deltaT == 0.0d) { return; } if (deltaT > 0.0d && solution.Temperature >= _maxTemp) { return; } if (deltaT < 0.0d && solution.Temperature <= _minTemp) { return; } solution.Temperature = MathF.Max(MathF.Min(solution.Temperature + deltaT, _minTemp), _maxTemp); }
public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out PlantHolderComponent? plantHolderComp) || plantHolderComp.Seed == null || plantHolderComp.Dead || plantHolderComp.Seed.Immutable) { return; } var random = IoCManager.Resolve <IRobustRandom>(); var chance = MathHelper.Lerp(15f, 150f, plantHolderComp.Seed.Potency) * 3.5f; if (random.Prob(chance)) { plantHolderComp.CheckForDivergence(true); plantHolderComp.Seed.Potency++; } chance = MathHelper.Lerp(6f, 2f, plantHolderComp.Seed.Yield) * 0.15f; if (random.Prob(chance)) { plantHolderComp.CheckForDivergence(true); plantHolderComp.Seed.Yield--; } }
//Remove reagent at set rate, satiate hunger if a HungerComponent can be found public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out HungerComponent? hunger)) { hunger.UpdateFood(NutritionFactor * (float)args.Quantity); } }
/// Satiate thirst if a ThirstComponent can be found public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out ThirstComponent? thirst)) { EntitySystem.Get <ThirstSystem>().UpdateThirst(thirst, HydrationFactor); } }
public override void Effect(ReagentEffectArgs args) { var floatIntensity = (float)args.Quantity; if (!args.EntityManager.HasComponent <SolutionContainerManagerComponent>(args.SolutionEntity)) { return; } //Handle scaling if (_scaled) { floatIntensity = MathF.Min(floatIntensity, _maxScale); } else { floatIntensity = 1; } //Calculate intensities var finalDevastationRange = (int)MathF.Round(_devastationRange * floatIntensity); var finalHeavyImpactRange = (int)MathF.Round(_heavyImpactRange * floatIntensity); var finalLightImpactRange = (int)MathF.Round(_lightImpactRange * floatIntensity); var finalFlashRange = (int)MathF.Round(_flashRange * floatIntensity); EntitySystem.Get <ExplosionSystem>().SpawnExplosion(args.SolutionEntity, finalDevastationRange, finalHeavyImpactRange, finalLightImpactRange, finalFlashRange); }
public override void Effect(ReagentEffectArgs args) { EntitySystem.Get <ElectrocutionSystem>().TryDoElectrocution(args.SolutionEntity, null, Math.Max((args.Quantity * ElectrocuteDamageScale).Int(), 1), TimeSpan.FromSeconds(ElectrocuteTime), Refresh); args.Source?.RemoveReagent(args.Reagent.ID, args.Quantity); }
/// Satiate thirst if a ThirstComponent can be found public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out ThirstComponent? thirst)) { thirst.UpdateThirst(HydrationFactor); } }
public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out TemperatureComponent temp)) { var sys = args.EntityManager.EntitySysManager.GetEntitySystem <TemperatureSystem>(); sys.ChangeHeat(args.SolutionEntity, Amount, true, temp); } }
public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent <RespiratorComponent>(args.SolutionEntity, out var resp)) { var respSys = EntitySystem.Get <RespiratorSystem>(); respSys.UpdateSaturation(resp.Owner, args.Quantity.Float() * Factor, resp); } }
public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager, mustHaveAlivePlant: false)) { return; } plantHolderComp.AdjustWater(Amount); }
public override bool Condition(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent <TagComponent>(args.SolutionEntity, out var tag)) { return(tag.HasTag(Tag) ^ Invert); } return(false); }
public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out CreamPiedComponent? creamPied)) { return; } EntitySystem.Get <CreamPieSystem>().SetCreamPied(args.SolutionEntity, creamPied, false); }
public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) { return; } plantHolderComp.PestLevel += Amount; }
public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent <BloodstreamComponent>(args.SolutionEntity, out var blood)) { var sys = EntitySystem.Get <BloodstreamSystem>(); var amt = Scaled ? Amount * args.Quantity.Float() : Amount; sys.TryModifyBleedAmount(args.SolutionEntity, amt, blood); } }
public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) { return; } plantHolderComp.AffectGrowth((int)Amount); }
public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out FlammableComponent? flammable)) { return; } EntitySystem.Get <FlammableSystem>().AdjustFireStacks(args.SolutionEntity, args.Quantity.Float() * Multiplier, flammable); args.Source?.RemoveReagent(args.Reagent.ID, args.Quantity); }
public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) { return; } plantHolderComp.AdjustNutrient(Amount); return; }
public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent <LungComponent>(args.OrganEntity, out var lung)) { foreach (var(gas, ratio) in _ratios) { lung.Air.Moles[(int)gas] += (ratio * args.Quantity.Float()) / Atmospherics.BreathMolesToReagentMultiplier; } } }
public override void Effect(ReagentEffectArgs args) { if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager)) { return; } plantHolderComp.Health += Amount; plantHolderComp.CheckHealth(); }
public override bool Condition(ReagentEffectArgs args) { if (args.Source == null) return false; if (args.Source.ThermalEnergy < Min) return false; if (args.Source.ThermalEnergy > Max) return false; return true; }
public override void Effect(ReagentEffectArgs args) { var intensity = MathF.Min((float)args.Quantity * IntensityPerUnit, MaxTotalIntensity); EntitySystem.Get <ExplosionSystem>().QueueExplosion( args.SolutionEntity, ExplosionType, intensity, IntensitySlope, MaxIntensity); }
public override void Effect(ReagentEffectArgs args) { var atmosSys = args.EntityManager.EntitySysManager.GetEntitySystem <AtmosphereSystem>(); var tileMix = atmosSys.GetContainingMixture(args.SolutionEntity, false, true); if (tileMix != null) { tileMix.AdjustMoles(Gas, args.Quantity.Float() * Multiplier); } }
public override void Effect(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent <DiseasedComponent>(args.SolutionEntity, out var diseased)) { return; } var random = IoCManager.Resolve <IRobustRandom>(); EntitySystem.Get <DiseaseSystem>().TryAddDisease(args.SolutionEntity, random.Pick(Diseases)); }
public override void Effect(ReagentEffectArgs args) { var solution = args.Source; if (solution == null) { return; } solution.Temperature = _temperature; }
public override bool Condition(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out TemperatureComponent temp)) { if (temp.CurrentTemperature > Min && temp.CurrentTemperature < Max) { return(true); } } return(false); }
public override void Effect(ReagentEffectArgs args) { var atmosSys = EntitySystem.Get <AtmosphereSystem>(); var xform = args.EntityManager.GetComponent <TransformComponent>(args.SolutionEntity); var tileMix = atmosSys.GetTileMixture(xform.Coordinates); if (tileMix != null) { tileMix.AdjustMoles(Gas, args.Quantity.Float() * Multiplier); } }
public override void Effect(ReagentEffectArgs args) { if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out FlammableComponent? flammable)) { return; } var flammableSystem = EntitySystem.Get <FlammableSystem>(); flammableSystem.Extinguish(args.SolutionEntity, flammable); flammableSystem.AdjustFireStacks(args.SolutionEntity, -1.5f * (float)args.Quantity, flammable); }
public override bool Condition(ReagentEffectArgs args) { if (args.EntityManager.TryGetComponent(args.SolutionEntity, out DamageableComponent damage)) { var total = damage.TotalDamage; if (total > Min && total < Max) { return(true); } } return(false); }
public override void Effect(ReagentEffectArgs args) { if (args.Source == null) { return; } var splitSolution = EntitySystem.Get <SolutionContainerSystem>().SplitSolution(args.SolutionEntity, args.Source, args.Source.MaxVolume); // We take the square root so it becomes harder to reach higher amount values var amount = (int)Math.Round(_rangeConstant + _rangeMultiplier * Math.Sqrt(args.Quantity.Float())); amount = Math.Min(amount, _maxRange); if (_diluteReagents) { // The maximum value of solutionFraction is _reagentMaxConcentrationFactor, achieved when amount = 0 // The infimum of solutionFraction is 0, which is approached when amount tends to infinity // solutionFraction is equal to 1 only when amount equals _reagentDilutionStart // Weird formulas here but basically when amount increases, solutionFraction gets closer to 0 in a reciprocal manner // _reagentDilutionFactor defines how fast solutionFraction gets closer to 0 float solutionFraction = 1 / (_reagentDilutionFactor * (amount) + 1); splitSolution.RemoveSolution(splitSolution.TotalVolume * (1 - solutionFraction)); } var transform = args.EntityManager.GetComponent <TransformComponent>(args.SolutionEntity); if (!_mapManager.TryFindGridAt(transform.MapPosition, out var grid)) { return; } var coords = grid.MapToGrid(transform.MapPosition); var ent = args.EntityManager.SpawnEntity(_prototypeId, coords.SnapToGrid()); var areaEffectComponent = GetAreaEffectComponent(ent); if (areaEffectComponent == null) { Logger.Error("Couldn't get AreaEffectComponent from " + _prototypeId); IoCManager.Resolve <IEntityManager>().QueueDeleteEntity(ent); return; } areaEffectComponent.TryAddSolution(splitSolution); areaEffectComponent.Start(amount, _duration, _spreadDelay, _removeDelay); SoundSystem.Play(Filter.Pvs(args.SolutionEntity), _sound.GetSound(), args.SolutionEntity, AudioHelpers.WithVariation(0.125f)); }