示例#1
0
        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}");
                }
            }
        }
示例#2
0
        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}");
                }
            }
        }
示例#3
0
 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;
        }
示例#5
0
        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();
            }
        }
示例#7
0
        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);
        }
示例#8
0
        // 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;
            }
        }
示例#9
0
 public HungerComponentState(HungerThreshold currentThreshold)
 {
     CurrentThreshold = currentThreshold;
 }
示例#10
0
 public HungerComponentState(HungerThreshold currentThreshold) : base(ContentNetIDs.HUNGER)
 {
     CurrentThreshold = currentThreshold;
 }