using Content.Server.Nutrition.Components; using Content.Server.Popups; using Content.Shared.Interaction; using Content.Shared.Interaction.Helpers; using Robust.Shared.Audio; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Player; using Robust.Shared.Random; namespace Content.Server.Nutrition.EntitySystems { /// /// Handles usage of the utensils on the food items /// internal sealed class UtensilSystem : EntitySystem { [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly FoodSystem _foodSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnAfterInteract); } /// /// Clicked with utensil /// private void OnAfterInteract(EntityUid uid, UtensilComponent component, AfterInteractEvent ev) { if (ev.Target == null || !ev.CanReach) return; if (TryUseUtensil(ev.User, ev.Target.Value, component)) ev.Handled = true; } private bool TryUseUtensil(EntityUid user, EntityUid target, UtensilComponent component) { if (!EntityManager.TryGetComponent(target, out FoodComponent food)) return false; //Prevents food usage with a wrong utensil if ((food.Utensil & component.Types) == 0) { _popupSystem.PopupEntity(Loc.GetString("food-system-wrong-utensil", ("food", food.Owner), ("utensil", component.Owner)), user, Filter.Entities(user)); return false; } if (!_interactionSystem.InRangeUnobstructed(user, target, popup: true)) return false; return _foodSystem.TryFeed(user, target, food); } /// /// Attempt to break the utensil after interaction. /// /// Utensil. /// User of the utensil. public void TryBreak(EntityUid uid, EntityUid userUid, UtensilComponent? component = null) { if (!Resolve(uid, ref component)) return; if (_robustRandom.Prob(component.BreakChance)) { SoundSystem.Play(Filter.Pvs(userUid), component.BreakSound.GetSound(), userUid, AudioParams.Default.WithVolume(-2f)); EntityManager.DeleteEntity(component.Owner); } } } }