public void HungerThresholdEffect(bool force = false) { if (_currentHungerThreshold != _lastHungerThreshold || force) { Logger.InfoS("hunger", $"Updating hunger state for {Owner.Name}"); // Revert slow speed if required if (_lastHungerThreshold == HungerThreshold.Starving && _currentHungerThreshold != HungerThreshold.Dead && Owner.TryGetComponent(out PlayerInputMoverComponent playerSpeedupComponent)) { // TODO shitcode: Come up something better playerSpeedupComponent.WalkMoveSpeed = playerSpeedupComponent.WalkMoveSpeed * 2; playerSpeedupComponent.SprintMoveSpeed = playerSpeedupComponent.SprintMoveSpeed * 4; } // Update UI Owner.TryGetComponent(out ServerStatusEffectsComponent statusEffectsComponent); statusEffectsComponent?.ChangeStatus(StatusEffect.Hunger, "/Textures/Mob/UI/Hunger/" + _currentHungerThreshold + ".png"); switch (_currentHungerThreshold) { case HungerThreshold.Overfed: _lastHungerThreshold = _currentHungerThreshold; _actualDecayRate = _baseDecayRate * 1.2f; return; case HungerThreshold.Okay: _lastHungerThreshold = _currentHungerThreshold; _actualDecayRate = _baseDecayRate; return; case HungerThreshold.Peckish: // Same as okay except with UI icon saying eat soon. _lastHungerThreshold = _currentHungerThreshold; _actualDecayRate = _baseDecayRate * 0.8f; return; case HungerThreshold.Starving: // TODO: If something else bumps this could cause mega-speed. // If some form of speed update system if multiple things are touching it use that. if (Owner.TryGetComponent(out PlayerInputMoverComponent playerInputMoverComponent)) { playerInputMoverComponent.WalkMoveSpeed = playerInputMoverComponent.WalkMoveSpeed / 2; playerInputMoverComponent.SprintMoveSpeed = playerInputMoverComponent.SprintMoveSpeed / 4; } _lastHungerThreshold = _currentHungerThreshold; _actualDecayRate = _baseDecayRate * 0.6f; return; case HungerThreshold.Dead: return; default: Logger.ErrorS("hunger", $"No hunger threshold found for {_currentHungerThreshold}"); throw new ArgumentOutOfRangeException($"No hunger threshold found for {_currentHungerThreshold}"); } } }
public void HungerThresholdEffect(bool force = false) { if (_currentHungerThreshold != _lastHungerThreshold || force) { Logger.InfoS("hunger", $"Updating hunger state for {Owner.Name}"); // Revert slow speed if required if (_lastHungerThreshold == HungerThreshold.Starving && _currentHungerThreshold != HungerThreshold.Dead && Owner.TryGetComponent(out MovementSpeedModifierComponent movementSlowdownComponent)) { movementSlowdownComponent.RefreshMovementSpeedModifiers(); } // Update UI Owner.TryGetComponent(out ServerStatusEffectsComponent statusEffectsComponent); statusEffectsComponent?.ChangeStatusEffectIcon(StatusEffect.Hunger, _hungerThresholdImages[(int)_currentHungerThreshold]); switch (_currentHungerThreshold) { case HungerThreshold.Overfed: _lastHungerThreshold = _currentHungerThreshold; _actualDecayRate = _baseDecayRate * 1.2f; return; case HungerThreshold.Okay: _lastHungerThreshold = _currentHungerThreshold; _actualDecayRate = _baseDecayRate; return; case HungerThreshold.Peckish: // Same as okay except with UI icon saying eat soon. _lastHungerThreshold = _currentHungerThreshold; _actualDecayRate = _baseDecayRate * 0.8f; return; case HungerThreshold.Starving: // TODO: If something else bumps this could cause mega-speed. // If some form of speed update system if multiple things are touching it use that. if (Owner.TryGetComponent(out MovementSpeedModifierComponent movementSlowdownComponent1)) { movementSlowdownComponent1.RefreshMovementSpeedModifiers(); } _lastHungerThreshold = _currentHungerThreshold; _actualDecayRate = _baseDecayRate * 0.6f; return; case HungerThreshold.Dead: return; default: Logger.ErrorS("hunger", $"No hunger threshold found for {_currentHungerThreshold}"); throw new ArgumentOutOfRangeException($"No hunger threshold found for {_currentHungerThreshold}"); } } }
protected override void Startup() { base.Startup(); // Similar functionality to SS13. Should also stagger people going to the chef. _currentHunger = _random.Next( (int)_hungerThresholds[HungerThreshold.Peckish] + 10, (int)_hungerThresholds[HungerThreshold.Okay] - 1); _currentHungerThreshold = GetHungerThreshold(_currentHunger); _lastHungerThreshold = HungerThreshold.Okay; // TODO: Potentially change this -> Used Okay because no effects. HungerThresholdEffect(true); }
public override void HandleComponentState(ComponentState?curState, ComponentState?nextState) { base.HandleComponentState(curState, nextState); if (curState is not HungerComponentState hunger) { return; } _currentHungerThreshold = hunger.CurrentThreshold; }
public override void HandleComponentState(ComponentState?curState, ComponentState?nextState) { base.HandleComponentState(curState, nextState); if (curState is not HungerComponentState hunger) { return; } _currentHungerThreshold = hunger.CurrentThreshold; EntitySystem.Get <MovementSpeedModifierSystem>().RefreshMovementSpeedModifiers(Owner); }
public override void HandleComponentState(ComponentState?curState, ComponentState?nextState) { if (!(curState is HungerComponentState hunger)) { return; } _currentHungerThreshold = hunger.CurrentThreshold; if (Owner.TryGetComponent(out MovementSpeedModifierComponent movement)) { movement.RefreshMovementSpeedModifiers(); } }
public HungerThreshold GetHungerThreshold(float food) { HungerThreshold result = HungerThreshold.Dead; var value = HungerThresholds[HungerThreshold.Overfed]; foreach (var threshold in _hungerThresholds) { if (threshold.Value <= value && threshold.Value >= food) { result = threshold.Key; value = threshold.Value; } } return(result); }
// TODO: If mob is moving increase rate of consumption? // Should use a multiplier as something like a disease would overwrite decay rate. public void OnUpdate(float frametime) { _currentHunger -= frametime * ActualDecayRate; var calculatedHungerThreshold = GetHungerThreshold(_currentHunger); // _trySound(calculatedThreshold); if (calculatedHungerThreshold != _currentHungerThreshold) { _currentHungerThreshold = calculatedHungerThreshold; HungerThresholdEffect(); } if (_currentHungerThreshold == HungerThreshold.Dead) { // TODO: Remove from dead people if (Owner.TryGetComponent(out DamageableComponent damage)) { damage.TakeDamage(DamageType.Brute, 2); return; } return; } }
public HungerComponentState(HungerThreshold currentThreshold) { CurrentThreshold = currentThreshold; }
public HungerComponentState(HungerThreshold currentThreshold) : base(ContentNetIDs.HUNGER) { CurrentThreshold = currentThreshold; }