/// <summary> /// </summary> /// <param name="client"> /// </param> /// <param name="quality"> /// </param> public static void TradeSkillBuildPressed(ZoneClient client, int quality) { TradeSkillInfo source = client.Character.TradeSkillSource; TradeSkillInfo target = client.Character.TradeSkillTarget; Item sourceItem = client.Character.BaseInventory.GetItemInContainer(source.Container, source.Placement); Item targetItem = client.Character.BaseInventory.GetItemInContainer(target.Container, target.Placement); TradeSkillEntry ts = TradeSkill.Instance.GetTradeSkillEntry(sourceItem.HighID, targetItem.HighID); quality = Math.Min(quality, ItemLoader.ItemList[ts.ResultHighId].Quality); if (ts != null) { if (WindowBuild(client, quality, ts, sourceItem, targetItem)) { Item newItem = new Item(quality, ts.ResultLowId, ts.ResultHighId); InventoryError inventoryError = client.Character.BaseInventory.TryAdd(newItem); if (inventoryError == InventoryError.OK) { AddTemplate.Send(client, newItem); // Delete source? if ((ts.DeleteFlag & 1) == 1) { client.Character.BaseInventory.RemoveItem(source.Container, source.Placement); DeleteItem.Send(client, source.Container, source.Placement); } // Delete target? if ((ts.DeleteFlag & 2) == 2) { client.Character.BaseInventory.RemoveItem(target.Container, target.Placement); DeleteItem.Send(client, target.Container, target.Placement); } client.Character.Playfield.Publish( ChatText.CreateIM( client.Character, SuccessMessage( sourceItem, targetItem, new Item(quality, ts.ResultLowId, ts.ResultHighId)))); client.Character.Stats[StatIds.xp].Value += CalculateXP(quality, ts); } } } else { client.Character.Playfield.Publish( ChatText.CreateIM( client.Character, "It is not possible to assemble those two items. Maybe the order was wrong?")); client.Character.Playfield.Publish(ChatText.CreateIM(client.Character, "No combination found!")); } }
/// <summary> /// </summary> /// <param name="client"> /// </param> private static void TradeSkillChanged(IZoneClient client) { TradeSkillInfo source = client.Controller.Character.TradeSkillSource; TradeSkillInfo target = client.Controller.Character.TradeSkillTarget; if ((source != null) && (target != null)) { Item sourceItem = client.Controller.Character.BaseInventory.GetItemInContainer( source.Container, source.Placement); Item targetItem = client.Controller.Character.BaseInventory.GetItemInContainer( target.Container, target.Placement); TradeSkillEntry ts = TradeSkill.Instance.GetTradeSkillEntry(sourceItem.HighID, targetItem.HighID); if (ts != null) { if (ts.ValidateRange(sourceItem.Quality, targetItem.Quality)) { foreach (TradeSkillSkill tsi in ts.Skills) { int skillReq = (int)Math.Ceiling(tsi.Percent / 100M * targetItem.Quality); if (skillReq > client.Controller.Character.Stats[tsi.StatId].Value) { TradeSkillPacket.SendRequirement(client.Controller.Character, tsi.StatId, skillReq); } } int leastbump = 0; int maxbump = 0; if (ts.IsImplant) { if (targetItem.Quality >= 250) { maxbump = 5; } else if (targetItem.Quality >= 201) { maxbump = 4; } else if (targetItem.Quality >= 150) { maxbump = 3; } else if (targetItem.Quality >= 100) { maxbump = 2; } else if (targetItem.Quality >= 50) { maxbump = 1; } } foreach (TradeSkillSkill tsSkill in ts.Skills) { if (tsSkill.SkillPerBump != 0) { leastbump = Math.Min( Convert.ToInt32( (client.Controller.Character.Stats[tsSkill.StatId].Value - (tsSkill.Percent / 100M * targetItem.Quality)) / tsSkill.SkillPerBump), maxbump); } } TradeSkillPacket.SendResult( client.Controller.Character, targetItem.Quality, Math.Min(targetItem.Quality + leastbump, ItemLoader.ItemList[ts.ResultHighId].Quality), ts.ResultLowId, ts.ResultHighId); } else { TradeSkillPacket.SendOutOfRange( client.Controller.Character, Convert.ToInt32( Math.Round((double)targetItem.Quality - ts.QLRangePercent * targetItem.Quality / 100))); } } else { TradeSkillPacket.SendNotTradeskill(client.Controller.Character); } } }