public override void Ready(bool ready, ushort step) { List<CharacterItemRecord> results = new List<CharacterItemRecord>(); Dictionary<uint, uint> removed = new Dictionary<uint, uint>(); if (ready) { var recipe = GetRecipe(); if (recipe != null && recipe.ResultLevel <= CharacterJob.Level) { for (int i = 0; i < Count; i++) { if (Character.IsInExchange(ExchangeTypeEnum.CRAFT)) { results.Add(recipe.Result.GetCharacterItem(Character.Id, 1, true)); // True = jet parfait foreach (var ingredient in CraftedItems.GetItems()) { if (!removed.ContainsKey(ingredient.UId)) removed.Add(ingredient.UId, ingredient.Quantity); else removed[ingredient.UId] += ingredient.Quantity; } } else return; } CraftedItems.Clear(false); Character.Inventory.RemoveItems(removed); Character.Inventory.AddItems(results); OnCraftResulted(CraftResultEnum.CRAFT_SUCCESS, results.Last()); Character.SendMap(new ExchangeCraftInformationObjectMessage((sbyte)CraftResultEnum.CRAFT_SUCCESS, recipe.ResultId, (ulong)Character.Id)); int craftXpRatio = recipe.Result.Weapon ? WeaponRecord.GetWeapon(recipe.ResultId).CraftXpRatio : -1; int exp = FormulasProvider.Instance.GetCraftXpByJobLevel(recipe.ResultLevel, CharacterJob.Level, craftXpRatio); Character.AddJobExp(JobType, (ulong)(exp * Count)); SetCount(1); } else { OnCraftResulted(CraftResultEnum.CRAFT_FAILED); } } else { OnCraftResulted(CraftResultEnum.CRAFT_FAILED); } }
private RecipeRecord GetRecipe() { Dictionary<ushort, uint> ingredients = new Dictionary<ushort, uint>(); foreach (var item in CraftedItems.GetItems()) { if (!ingredients.ContainsKey(item.GId)) ingredients.Add(item.GId, item.Quantity); } var template = RecipeRecord.Recipes.Find(x => x.Ingredients.ScramEqualDictionary(ingredients) && x.SkillId == SkillId); return template; }