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)); }
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); }
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); } }
protected override void ServerUpdate(ServerUpdateData data) { FoodSpoilageSystem.ServerUpdateFoodFreshness(data.GameObject, data.DeltaTime); }
protected override void ServerInitialize(ServerInitializeData data) { base.ServerInitialize(data); FoodSpoilageSystem.ServerInitializeItem(data.PrivateState, data.IsFirstTimeInit); }
protected sealed override void PrepareProtoItem() { base.PrepareProtoItem(); this.FreshnessMaxValue = FoodSpoilageSystem.SharedCalculateFreshnessMaxValue(this); this.PrepareProtoItemFood(); }