public void Complete(Creature creature, Skill skill, Packet packet)
{
var unkInt = packet.GetInt();
// Get recipe and create item
Item item = null;
var success = false;
var recipe = AuraData.CookingDb.Find(creature.Temp.CookingMethod, creature.Temp.CookingIngredients.Select(a => a.Item.Info.Id));
if (recipe != null)
{
// Get judgement
var judgement = this.JudgeQuality(recipe, creature.Temp.CookingIngredients);
if (judgement.Quality >= SuccessMinQuality)
{
var quality = (int)judgement.Quality;
var rating = this.GetRating((int)judgement.Quality);
// Create food if quality was good enough
item = new Item(recipe.ItemId);
item.MetaData1.SetInt("QUAL", quality);
item.MetaData1.SetString("MKNAME", creature.Name);
item.MetaData1.SetShort("MKSLV", (short)skill.Info.Rank);
item.MetaData1.SetString("MKACT", creature.Temp.CookingMethod);
// Notice
var msg = "";
if (judgement.Quality > 75)
msg += Localization.Get("You just made a delicious dish!");
else if (judgement.Quality > 55)
msg += Localization.Get("You just made a tasty dish!");
else if (judgement.Quality > 35)
msg += Localization.Get("You just made an edible dish.");
else if (judgement.Quality > -35)
msg += Localization.Get("You just made a pretty unappetizing dish...");
else
msg += Localization.Get("You just made a dish... that you probably shouldn't eat. Yuck!");
// Help message
if (judgement.HelpItem != null)
{
var rnd = RandomProvider.Get();
var helpmsg = "";
if (judgement.HelpAmount < 0)
helpmsg += Localization.Get("There may have been {1:0.0}%-{2:0.0}% less {0} than required.");
else
helpmsg += Localization.Get("There may have been {1:0.0}%-{2:0.0}% more {0} than required.");
var name = judgement.HelpItem.Data.Name;
var amount = Math.Abs(judgement.HelpAmount) * 100;
var min = (amount - rnd.NextDouble());
var max = (amount + rnd.NextDouble());
msg += string.Format("\n" + helpmsg, name, min, max);
}
Send.Notice(creature, msg);
this.OnSuccessfulCooking(creature, skill, creature.Temp.CookingMethod, item, rating);
success = true;
}
}
else
{
//Log.Debug("Recipe not found");
//Log.Debug("Method: " + creature.Temp.CookingMethod);
//Log.Debug("Ingredients:");
//foreach (var ingredient in creature.Temp.CookingIngredients)
// Log.Debug("- " + ingredient.Item.Info.Id);
}
// Create food waste if nothing halfway decent was created
if (!success)
{
item = new Item(FoodWasteItemId);
Send.Notice(creature, Localization.Get("Cooking failed"));
}
// Remove ingredient items
// According to the Wiki the whole stack gets removed.
foreach (var ingredient in creature.Temp.CookingIngredients)
creature.Inventory.Remove(ingredient.Item);
// Replace bottled goods with empty bottles
foreach (var ingredient in creature.Temp.CookingIngredients)
{
if (ingredient.Item.HasTag("/milk/|/water/"))
creature.Inventory.Add(new Item(EmptyBottleItemId), true);
}
// Add item to inv
creature.Inventory.Add(item, true);
// Cooking event
ChannelServer.Instance.Events.OnCreatureCookedMeal(new CookingEventArgs(creature, recipe, success, item));
// Effects and response
Send.AcquireInfo2Cooking(creature, item.EntityId, item.Info.Id, success);
Send.Effect(creature, Effect.Cooking, (byte)0, (byte)(success ? 4 : 1));
Send.SkillComplete(creature, skill.Info.Id, unkInt);
}