Ejemplo n.º 1
0
        private void ServerRemote_Eat(IItem item)
        {
            var character = ServerRemoteContext.Character;

            this.ServerValidateItemForRemoteCall(item, character);

            var stats = PlayerCharacter.GetPublicState(character).CurrentStatsExtended;

            var freshness = FoodSpoilageSystem.SharedGetFreshnessEnum(item);

            // check that the player has perk to eat a spoiled food
            if (freshness == FoodFreshness.Red &&
                character.SharedHasPerk(StatName.PerkEatSpoiledFood))
            {
                freshness = FoodFreshness.Yellow;
            }

            var itemEatData = new ItemEatData(item, character, stats, freshness);

            if (!this.SharedCanEat(itemEatData))
            {
                return;
            }

            this.ServerOnEat(itemEatData);
            Logger.Important(character + " consumed " + item);

            this.ServerNotifyItemUsed(character, item);
            // decrease item count
            Server.Items.SetCount(item, (ushort)(item.Count - 1));
        }
Ejemplo n.º 2
0
        protected override bool ClientItemUseFinish(ClientItemData data)
        {
            var character = Client.Characters.CurrentPlayerCharacter;
            var item      = data.Item;
            var stats     = PlayerCharacter.GetPublicState(character).CurrentStatsExtended;

            if (!this.SharedCanEat(
                    new ItemEatData(item,
                                    character,
                                    stats,
                                    FoodSpoilageSystem.SharedGetFreshnessEnum(item))))
            {
                return(false);
            }

            this.CallServer(_ => _.ServerRemote_Eat(item));
            return(true);
        }
Ejemplo n.º 3
0
        protected virtual void ServerOnEat(ItemEatData data)
        {
            var freshnessCoef = FoodSpoilageSystem.SharedGetFreshnessPositiveEffectsCoef(data.Freshness);

            data.CurrentStats.SharedSetStaminaCurrent(data.CurrentStats.StaminaCurrent
                                                      + ApplyFreshness(this.StaminaRestore));

            data.CurrentStats.ServerSetHealthCurrent(data.CurrentStats.HealthCurrent
                                                     + ApplyFreshness(this.HealthRestore));

            data.CurrentStats.ServerSetFoodCurrent(data.CurrentStats.FoodCurrent
                                                   + ApplyFreshness(this.FoodRestore));

            data.CurrentStats.ServerSetWaterCurrent(data.CurrentStats.WaterCurrent
                                                    + ApplyFreshness(this.WaterRestore));

            // Please note: if player has an artificial stomach than the food freshness cannot be red.
            if (data.Freshness == FoodFreshness.Red)
            {
                // 20% chance to get food poisoning
                if (RandomHelper.RollWithProbability(0.2))
                {
                    data.Character.ServerAddStatusEffect <StatusEffectNausea>(intensity: 0.5); // 5 minutes
                }
            }

            float ApplyFreshness(float value)
            {
                if (value <= 0)
                {
                    return(value);
                }

                value *= freshnessCoef;
                return(value);
            }
        }
Ejemplo n.º 4
0
 protected override void ServerUpdate(ServerUpdateData data)
 {
     FoodSpoilageSystem.ServerUpdateFoodFreshness(data.GameObject, data.DeltaTime);
 }
Ejemplo n.º 5
0
 protected override void ServerInitialize(ServerInitializeData data)
 {
     base.ServerInitialize(data);
     FoodSpoilageSystem.ServerInitializeItem(data.PrivateState, data.IsFirstTimeInit);
 }
Ejemplo n.º 6
0
 protected sealed override void PrepareProtoItem()
 {
     base.PrepareProtoItem();
     this.FreshnessMaxValue = FoodSpoilageSystem.SharedCalculateFreshnessMaxValue(this);
     this.PrepareProtoItemFood();
 }