fix microwave deleting entities at will (#1073)

Co-authored-by: FL-OZ <anotherscuffed@gmail.com>
This commit is contained in:
FL-OZ
2020-06-05 11:46:34 -05:00
committed by GitHub
parent fa9169e346
commit 470f81fca1
3 changed files with 69 additions and 19 deletions

View File

@@ -278,9 +278,21 @@ namespace Content.Server.GameObjects.Components.Kitchen
}
}
var failState = MicrowaveSuccessState.RecipeFail;
foreach(var id in solidsDict.Keys)
{
if(_recipeManager.SolidAppears(id))
{
continue;
}
failState = MicrowaveSuccessState.UnwantedForeignObject;
break;
}
// Check recipes
FoodRecipePrototype recipeToCook = null;
foreach (var r in _recipeManager.Recipes.Where(r => CanSatisfyRecipe(r, solidsDict)))
foreach (var r in _recipeManager.Recipes.Where(r => CanSatisfyRecipe(r, solidsDict) == MicrowaveSuccessState.RecipePass))
{
recipeToCook = r;
}
@@ -288,7 +300,6 @@ namespace Content.Server.GameObjects.Components.Kitchen
var goodMeal = (recipeToCook != null)
&&
(_currentCookTimerTime == (uint)recipeToCook.CookTime);
SetAppearance(MicrowaveVisualState.Cooking);
_audioSystem.Play(_startCookingSound, Owner, AudioParams.Default);
Timer.Spawn((int)(_currentCookTimerTime * _cookTimeMultiplier), () =>
@@ -297,21 +308,31 @@ namespace Content.Server.GameObjects.Components.Kitchen
{
return;
}
if (goodMeal)
if(failState == MicrowaveSuccessState.UnwantedForeignObject)
{
SubtractContents(recipeToCook);
VaporizeReagents();
EjectSolids();
}
else
{
VaporizeReagents();
VaporizeSolids();
if (goodMeal)
{
SubtractContents(recipeToCook);
}
else
{
VaporizeReagents();
VaporizeSolids();
}
if (recipeToCook != null)
{
var entityToSpawn = goodMeal ? recipeToCook.Result : _badRecipeName;
_entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition);
}
}
if (recipeToCook != null)
{
var entityToSpawn = goodMeal ? recipeToCook.Result : _badRecipeName;
_entityManager.SpawnEntity(entityToSpawn, Owner.Transform.GridPosition);
}
_audioSystem.Play(_cookingCompleteSound, Owner, AudioParams.Default.WithVolume(-1f));
SetAppearance(MicrowaveVisualState.Idle);
_busy = false;
@@ -385,18 +406,18 @@ namespace Content.Server.GameObjects.Components.Kitchen
}
private bool CanSatisfyRecipe(FoodRecipePrototype recipe, Dictionary<string,int> solids)
private MicrowaveSuccessState CanSatisfyRecipe(FoodRecipePrototype recipe, Dictionary<string,int> solids)
{
foreach (var reagent in recipe.IngredientsReagents)
{
if (!_solution.ContainsReagent(reagent.Key, out var amount))
{
return false;
return MicrowaveSuccessState.RecipeFail;
}
if (amount.Int() < reagent.Value)
{
return false;
return MicrowaveSuccessState.RecipeFail;
}
}
@@ -404,16 +425,17 @@ namespace Content.Server.GameObjects.Components.Kitchen
{
if (!solids.ContainsKey(solid.Key))
{
return false;
return MicrowaveSuccessState.RecipeFail;
}
if (solids[solid.Key] < solid.Value)
{
return false;
return MicrowaveSuccessState.RecipeFail;
}
}
return true;
return MicrowaveSuccessState.RecipePass;
}
private void ClickSound()

View File

@@ -0,0 +1,10 @@
namespace Content.Server.GameObjects.Components.Kitchen
{
public enum MicrowaveSuccessState
{
RecipePass,
RecipeFail,
UnwantedForeignObject
}
}

View File

@@ -24,6 +24,24 @@ namespace Content.Shared.Kitchen
Recipes.Sort(new RecipeComparer());
}
/// <summary>
/// Check if a prototype ids appears in any of the recipes that exist.
/// </summary>
/// <param name="solidIds"></param>
/// <returns></returns>
public bool SolidAppears(string solidId)
{
foreach(var recipe in Recipes)
{
if(recipe.IngredientsSolids.ContainsKey(solidId))
{
return true;
}
}
return false;
}
private class RecipeComparer : Comparer<FoodRecipePrototype>
{
public override int Compare(FoodRecipePrototype x, FoodRecipePrototype y)