public override bool OnDragDrop(Mobile from, Item dropped) { if (dropped is BaseTool) { BaseTool tool = dropped as BaseTool; if (tool.CraftSystem == _CraftSystem) { if (UsesRemaining >= MaxUses) { from.SendMessage("That is already at its maximum charges."); return(false); } else { int toadd = Math.Min(tool.UsesRemaining, MaxUses - UsesRemaining); UsesRemaining += toadd; tool.UsesRemaining -= toadd; if (tool.UsesRemaining <= 0 && !tool.Deleted) { tool.Delete(); } return(true); } } } return(false); }
public override bool OnDragDrop(Mobile from, Item dropped) { BaseHouse house = BaseHouse.FindHouseAt(this); CraftAddon addon = Addon as CraftAddon; if (house != null && addon != null && house.HasSecureAccess(from, addon.Level) && dropped is BaseTool && !(dropped is BaseRunicTool)) { BaseTool tool = dropped as BaseTool; if (addon != null && tool.CraftSystem == addon.CraftSystem) { AddonToolComponent comp = addon.Tools.FirstOrDefault(t => t != null); if (comp == null) { return(false); } if (comp.UsesRemaining >= comp.MaxUses) { from.SendMessage("That is already at its maximum charges."); return(false); } else { int toadd = Math.Min(tool.UsesRemaining, comp.MaxUses - comp.UsesRemaining); comp.UsesRemaining += toadd; tool.UsesRemaining -= toadd; if (tool.UsesRemaining <= 0 && !tool.Deleted) { tool.Delete(); } Effects.PlaySound(this.Location, this.Map, 0x42); return(false); } } } return(false); }
protected override void OnTarget(Mobile from, object targeted) { if (targeted is BaseTool) { BaseTool baseTool = targeted as BaseTool; if (baseTool.CraftSystem == Engines.Craft.DefCarpentry.CraftSystem) { WoodworkersTool tool = new WoodworkersTool(baseTool.UsesRemaining, baseTool.ItemID); tool.Name = baseTool.DefaultName + ": a Woodworker's Tool"; if (from.AddToBackpack(tool)) { baseTool.Delete(); from.SendGump(new BuildGump(from, DefWoodworking.BuildSystem, tool, "")); } } else { from.SendMessage("That is not a woodworking tool."); } } else if (targeted is BaseBuildingTool) { BaseBuildingTool tool = targeted as BaseBuildingTool; BuildSystem syst = tool.BuildSystem; if (syst == DefWoodworking.BuildSystem) { from.SendGump(new BuildGump(from, syst, tool, "")); } else { from.SendMessage("That is not a woodworking tool."); } } else { from.SendMessage("That is not a woodworking tool."); } }
public void CompleteCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CustomCraft customCraft ) { int badCraft = craftSystem.CanCraft( from, tool, m_Type ); if ( badCraft > 0 ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, badCraft ) ); else from.SendLocalizedMessage( badCraft ); return; } int checkResHue = 0, checkMaxAmount = 0; object checkMessage = null; // Not enough resource to craft it if ( !ConsumeRes( from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, checkMessage ) ); else if ( checkMessage is int && (int)checkMessage > 0 ) from.SendLocalizedMessage( (int)checkMessage ); else if ( checkMessage is string ) from.SendMessage( (string)checkMessage ); return; } else if ( !ConsumeAttributes( from, ref checkMessage, false ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, checkMessage ) ); else if ( checkMessage is int && (int)checkMessage > 0 ) from.SendLocalizedMessage( (int)checkMessage ); else if ( checkMessage is string ) from.SendMessage( (string)checkMessage ); return; } bool toolBroken = false; int ignored = 1; int endquality = 1; bool allRequiredSkills = true; if ( CheckSkills( from, typeRes, craftSystem, ref ignored, ref allRequiredSkills ) ) { // Resource int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if ( !ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, message ) ); else if ( message is int && (int)message > 0 ) from.SendLocalizedMessage( (int)message ); else if ( message is string ) from.SendMessage( (string)message ); return; } else if ( !ConsumeAttributes( from, ref message, true ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, message ) ); else if ( message is int && (int)message > 0 ) from.SendLocalizedMessage( (int)message ); else if ( message is string ) from.SendMessage( (string)message ); return; } tool.UsesRemaining--; if ( craftSystem is DefBlacksmithy ) { AncientSmithyHammer hammer = from.FindItemOnLayer( Layer.OneHanded ) as AncientSmithyHammer; if ( hammer != null && hammer != tool ) { hammer.UsesRemaining--; if ( hammer.UsesRemaining < 1 ) hammer.Delete(); } } if ( tool.UsesRemaining < 1 ) toolBroken = true; if ( toolBroken ) tool.Delete(); int num = 0; Item item; if ( customCraft != null ) { item = customCraft.CompleteCraft( out num ); } else if ( typeof( MapItem ).IsAssignableFrom( ItemType ) && from.Map != Map.Trammel && from.Map != Map.Felucca ) { item = new IndecipherableMap(); from.SendLocalizedMessage( 1070800 ); // The map you create becomes mysteriously indecipherable. } else { item = Activator.CreateInstance( ItemType ) as Item; } if ( item != null ) { if( item is ICraftable ) endquality = ((ICraftable)item).OnCraft( quality, makersMark, from, craftSystem, typeRes, tool, this, resHue ); else if ( item.Hue == 0 ) item.Hue = resHue; if ( maxAmount > 0 ) { if ( !item.Stackable && item is IUsesRemaining ) ((IUsesRemaining)item).UsesRemaining *= maxAmount; else item.Amount = maxAmount; } from.AddToBackpack( item ); if( from.AccessLevel > AccessLevel.Player ) CommandLogging.WriteLine( from, "Crafting {0} with craft system {1}", CommandLogging.Format( item ), craftSystem.GetType().Name ); //from.PlaySound( 0x57 ); } if ( num == 0 ) num = craftSystem.PlayEndingEffect( from, false, true, toolBroken, endquality, makersMark, this ); bool queryFactionImbue = false; int availableSilver = 0; FactionItemDefinition def = null; Faction faction = null; if ( item is IFactionItem ) { def = FactionItemDefinition.Identify( item ); if ( def != null ) { faction = Faction.Find( from ); if ( faction != null ) { Town town = Town.FromRegion( from.Region ); if ( town != null && town.Owner == faction ) { Container pack = from.Backpack; if ( pack != null ) { availableSilver = pack.GetAmount( typeof( Silver ) ); if ( availableSilver >= def.SilverCost ) queryFactionImbue = Faction.IsNearType( from, def.VendorType, 12 ); } } } } } // TODO: Scroll imbuing if ( queryFactionImbue ) from.SendGump( new FactionImbueGump( quality, item, from, craftSystem, tool, num, availableSilver, faction, def ) ); else if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, num ) ); else if ( num > 0 ) from.SendLocalizedMessage( num ); } else if ( !allRequiredSkills ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, 1044153 ) ); else from.SendLocalizedMessage( 1044153 ); // You don't have the required skills to attempt this item. } else { ConsumeType consumeType = ( UseAllRes ? ConsumeType.Half : ConsumeType.All ); int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if ( !ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, true ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, message ) ); else if ( message is int && (int)message > 0 ) from.SendLocalizedMessage( (int)message ); else if ( message is string ) from.SendMessage( (string)message ); return; } tool.UsesRemaining--; if ( tool.UsesRemaining < 1 ) toolBroken = true; if ( toolBroken ) tool.Delete(); // SkillCheck failed. int num = craftSystem.PlayEndingEffect( from, true, true, toolBroken, endquality, false, this ); if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, num ) ); else if ( num > 0 ) from.SendLocalizedMessage( num ); } }
public void CompleteCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CustomCraft customCraft) { int badCraft = craftSystem.CanCraft(from, tool, m_Type); if (badCraft > 0) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, badCraft)); } else { from.SendLocalizedMessage(badCraft); } AutoCraftTimer.EndTimer(from); return; } int checkResHue = 0, checkMaxAmount = 0; object checkMessage = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); } else if (checkMessage is int && (int)checkMessage > 0) { from.SendLocalizedMessage((int)checkMessage); } else if (checkMessage is string) { from.SendMessage((string)checkMessage); } AutoCraftTimer.EndTimer(from); return; } else if (!ConsumeAttributes(from, ref checkMessage, false)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); } else if (checkMessage is int && (int)checkMessage > 0) { from.SendLocalizedMessage((int)checkMessage); } else if (checkMessage is string) { from.SendMessage((string)checkMessage); } AutoCraftTimer.EndTimer(from); return; } bool toolBroken = false; int ignored = 1; int endquality = 1; bool allRequiredSkills = true; if (CheckSkills(from, typeRes, craftSystem, ref ignored, ref allRequiredSkills)) { // Resource int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, message)); } else if (message is int && (int)message > 0) { from.SendLocalizedMessage((int)message); } else if (message is string) { from.SendMessage((string)message); } AutoCraftTimer.EndTimer(from); return; } else if (!ConsumeAttributes(from, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, message)); } else if (message is int && (int)message > 0) { from.SendLocalizedMessage((int)message); } else if (message is string) { from.SendMessage((string)message); } AutoCraftTimer.EndTimer(from); return; } tool.UsesRemaining--; if (craftSystem is DefBlacksmithy) { AncientSmithyHammer hammer = from.FindItemOnLayer(Layer.OneHanded) as AncientSmithyHammer; if (hammer != null && hammer != tool) { #region Mondain's Legacy if (hammer is HammerOfHephaestus) { if (hammer.UsesRemaining > 0) { hammer.UsesRemaining--; } if (hammer.UsesRemaining < 1) { from.PlaceInBackpack(hammer); } } else { hammer.UsesRemaining--; if (hammer.UsesRemaining < 1) { hammer.Delete(); } } #endregion } } #region Mondain's Legacy if (tool is HammerOfHephaestus) { if (tool.UsesRemaining < 1) { tool.UsesRemaining = 0; } } else { if (tool.UsesRemaining < 1) { toolBroken = true; } if (toolBroken) { tool.Delete(); } } #endregion int num = 0; Item item; if (customCraft != null) { item = customCraft.CompleteCraft(out num); } else if (typeof(MapItem).IsAssignableFrom(ItemType) && from.Map != Map.Trammel && from.Map != Map.Felucca) { item = new IndecipherableMap(); from.SendLocalizedMessage(1070800); // The map you create becomes mysteriously indecipherable. } else { item = Activator.CreateInstance(ItemType) as Item; } if (item != null) { #region Mondain's Legacy if (item is Board) { Type resourceType = typeRes; if (resourceType == null) { resourceType = Resources.GetAt(0).ItemType; } CraftResource thisResource = CraftResources.GetFromType(resourceType); switch (thisResource) { case CraftResource.OakWood: item = new OakBoard(); break; case CraftResource.AshWood: item = new AshBoard(); break; case CraftResource.YewWood: item = new YewBoard(); break; case CraftResource.Heartwood: item = new HeartwoodBoard(); break; case CraftResource.Bloodwood: item = new BloodwoodBoard(); break; case CraftResource.Frostwood: item = new FrostwoodBoard(); break; default: item = new Board(); break; } } #endregion if (item is ICraftable) { endquality = ((ICraftable)item).OnCraft(quality, makersMark, from, craftSystem, typeRes, tool, this, resHue); } else if (item is Food) { ((Food)item).PlayerConstructed = true; } else if (item.Hue == 0) { item.Hue = resHue; } if (maxAmount > 0) { if (!item.Stackable && item is IUsesRemaining) { ((IUsesRemaining)item).UsesRemaining *= maxAmount; } else { item.Amount = maxAmount; } } #region Plant Pigments if (item is PlantPigment && (craftSystem is DefAlchemy || craftSystem is DefCooking)) { ((PlantPigment)item).PigmentHue = PlantPigmentHueInfo.HueFromPlantHue(m_PlantHue); } if (item is NaturalDye && (craftSystem is DefAlchemy || craftSystem is DefCooking)) { ((NaturalDye)item).PigmentHue = PlantPigmentHueInfo.GetInfo(m_PlantPigmentHue).PlantPigmentHue; } if (item is SoftenedReeds && (craftSystem is DefAlchemy || craftSystem is DefCooking)) { ((SoftenedReeds)item).PlantHue = PlantHueInfo.GetInfo(m_PlantHue).PlantHue; } if (item is BaseContainer && (craftSystem is DefBasketweaving)) { (item).Hue = PlantHueInfo.GetInfo(m_PlantHue).Hue; } CraftContext context = craftSystem.GetContext(from); if (context.QuestOption == CraftQuestOption.QuestItem) { PlayerMobile px = from as PlayerMobile; if (!QuestHelper.CheckItem(px, item)) from.SendLocalizedMessage(1072355, null, 0x23); // That item does not match any of your quest criteria } #endregion from.AddToBackpack(item); if (from.IsStaff()) { CommandLogging.WriteLine( from, "Crafting {0} with craft system {1}", CommandLogging.Format(item), craftSystem.GetType().Name); } AutoCraftTimer.OnSuccessfulCraft(from); //from.PlaySound( 0x57 ); } if (num == 0) { num = craftSystem.PlayEndingEffect(from, false, true, toolBroken, endquality, makersMark, this); } bool queryFactionImbue = false; int availableSilver = 0; FactionItemDefinition def = null; Faction faction = null; if (item is IFactionItem) { def = FactionItemDefinition.Identify(item); if (def != null) { faction = Faction.Find(from); if (faction != null) { Town town = Town.FromRegion(from.Region); if (town != null && town.Owner == faction) { Container pack = from.Backpack; if (pack != null) { availableSilver = pack.GetAmount(typeof(Silver)); if (availableSilver >= def.SilverCost) { queryFactionImbue = Faction.IsNearType(from, def.VendorType, 12); } } } } } } // TODO: Scroll imbuing if (queryFactionImbue) { from.SendGump(new FactionImbueGump(quality, item, from, craftSystem, tool, num, availableSilver, faction, def)); } else if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, num)); } else if (num > 0) { from.SendLocalizedMessage(num); } } else if (!allRequiredSkills) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, 1044153)); } else { from.SendLocalizedMessage(1044153); // You don't have the required skills to attempt this item. } AutoCraftTimer.EndTimer(from); } else { ConsumeType consumeType = (UseAllRes ? ConsumeType.Half : ConsumeType.All); int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, message)); } else if (message is int && (int)message > 0) { from.SendLocalizedMessage((int)message); } else if (message is string) { from.SendMessage((string)message); } AutoCraftTimer.EndTimer(from); return; } tool.UsesRemaining--; if (tool.UsesRemaining < 1) { toolBroken = true; } if (toolBroken) { tool.Delete(); } // SkillCheck failed. int num = craftSystem.PlayEndingEffect(from, true, true, toolBroken, endquality, false, this); if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { from.SendGump(new CraftGump(from, craftSystem, tool, num)); } else if (num > 0) { from.SendLocalizedMessage(num); } } }
protected override void OnTarget(Mobile from, object targeted) { if (!(targeted is DryReeds) || !((DryReeds)targeted).IsChildOf(from.Backpack)) { from.SendLocalizedMessage(1046439); // That is not a valid target. from.SendLocalizedMessage(1074794); // Target the material to use: from.Target = new ReedsTarget(m_CraftSystem, m_TypeRes, m_Tool, m_CraftItem); } else { from.EndAction(typeof(CraftSystem)); DryReeds reeds = targeted as DryReeds; if (!reeds.IsChildOf(from.Backpack)) { // You do not have enough scouring toxins to make that! from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1112326)); } if (from.Backpack == null || from.Backpack.GetAmount(typeof(ScouringToxin)) < 1) { // You do not have enough scouring toxins to make that! from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1112326)); } else if (DryReeds.GetTotalReeds(from.Backpack, reeds.PlantHue) < 2) { // You don't have enough of this type of dry reeds to make that. from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1112250)); } else { bool allRequiredSkills = true; double chance = m_CraftItem.GetSuccessChance(from, m_TypeRes, m_CraftSystem, true, ref allRequiredSkills); if (chance > 0.0) { chance += m_CraftItem.GetTalismanBonus(from, m_CraftSystem); } if (allRequiredSkills) { if (chance < Utility.RandomDouble()) { DryReeds.ConsumeReeds(from.Backpack, reeds.PlantHue, 1); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044043)); // You failed to create the item, and some of your materials are lost. } else { from.Backpack.ConsumeTotal(typeof(ScouringToxin), 1); DryReeds.ConsumeReeds(from.Backpack, reeds.PlantHue, 2); from.AddToBackpack(new SoftenedReeds(reeds.PlantHue)); bool toolBroken = false; m_Tool.UsesRemaining--; if (m_Tool.UsesRemaining < 1) { toolBroken = true; } if (toolBroken) { m_Tool.Delete(); from.SendLocalizedMessage(1044038); // You have worn out your tool! from.SendLocalizedMessage(1044154); // You create the item. } if (!toolBroken) { // You create the item. from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044154)); } } } else { // You don't have the required skills to attempt this item. from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044153)); } } } }
public void CompleteCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CustomCraft customCraft, bool showGumps) { int badCraft = craftSystem.CanCraft(from, tool, m_Type); if (badCraft > 0) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, badCraft)); else from.SendLocalizedMessage(badCraft); return; } if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) { if (tool.CraftSystem == DefBlacksmithy.CraftSystem) { if (from.FindItemOnLayer(Layer.OneHanded) != tool) { from.SendGump(new CraftGump(from, craftSystem, tool, string.Format("You must have your smith hammer equipped!"))); return; } } else { if (!tool.IsChildOf(from.Backpack)) { from.SendGump(new CraftGump(from, craftSystem, tool, string.Format("You must have your tool in your backpack!"))); return; } } } else { from.SendLocalizedMessage(badCraft); return; } object checkMessage = null; int checkResHue = 0, checkMaxAmount = 0; // Not enough resource to craft it if ( !ConsumeRes( from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage ) ) { if (!tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } if (!ConsumeAttributes(from, ref checkMessage, false)) { if (!tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } bool toolBroken = false; int ignored = 1; int endquality = 1; bool allRequiredSkills = true; if (CheckSkills(from, typeRes, craftSystem, ref ignored, ref allRequiredSkills)) { // Resource int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message)) { if (!tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } if (!ConsumeAttributes(from, ref message, true)) { if (!tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } if (tool is WeaversSpool) tool.UsesRemaining--; if (craftSystem is DefBlacksmithy) { AncientSmithyHammer hammer = from.FindItemOnLayer(Layer.OneHanded) as AncientSmithyHammer; if (hammer != null && hammer != tool) { hammer.UsesRemaining--; if (hammer.UsesRemaining < 1) hammer.Delete(); } } if (tool.UsesRemaining < 1) toolBroken = true; if (toolBroken) tool.Delete(); int num = 0; Item item; if (customCraft != null) item = customCraft.CompleteCraft(out num); else if (typeof(MapItem).IsAssignableFrom(ItemType) && from.Map != Map.Trammel && from.Map != Map.Felucca) { item = new IndecipherableMap(); from.SendLocalizedMessage(1070800); // The map you create becomes mysteriously indecipherable. } else item = Activator.CreateInstance(ItemType) as Item; if (item != null && !item.Deleted) { if (craftSystem is DefCarpentry) { if (RetainsColorFrom(m_System, item.GetType())) { if (typeRes == typeof (OakLog)) item.Name = string.Format("Oak {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof (AshLog)) item.Name = string.Format("Ash {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof (YewLog)) item.Name = string.Format("Yew {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof (HeartwoodLog)) item.Name = string.Format("Heartwood {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof (BloodwoodLog)) item.Name = string.Format("Bloodwood {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof (FrostwoodLog)) item.Name = string.Format("Frostwood {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof(MahoganyLog)) item.Name = string.Format("Mahoganywood {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof(CedarLog)) item.Name = string.Format("Cedarwood {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof(WillowLog)) item.Name = string.Format("Willowwood {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); else if (typeRes == typeof(MystWoodLog)) item.Name = string.Format("Mystwood {0}", !string.IsNullOrEmpty(item.Name) ? item.Name.ToLower() : CliLoc.LocToString(item.LabelNumber).ToLower()); } } if (item is ICraftable) { if (item.Hue == 0) item.Hue = resHue; endquality = ((ICraftable)item).OnCraft(quality, makersMark, from, craftSystem, typeRes, tool, this, resHue); } else if (item.Hue == 0) { item.Hue = resHue; //Flag all high quality non ICraftable with a makers mark in the string if (craftSystem.MarkOption && makersMark && quality == 2 && from.Skills[craftSystem.MainSkill].Base >= 100.0) { endquality = quality; item.Name = string.Format("{0} crafted by {1}", !string.IsNullOrEmpty(item.Name) ? item.Name : CliLoc.LocToString(item.LabelNumber), from.Name); } } if (maxAmount > 0) if (!item.Stackable && item is IUsesRemaining) ((IUsesRemaining)item).UsesRemaining *= maxAmount; else item.Amount = maxAmount; #region Add to pack or ground if overweight //Taran: Check to see if player is overweight. If they are and the item drops to the //ground then a check is made to see if it can be stacked. If it can't and more than //20 items of the same type exist in the same tile then the last item gets removed. This //check is made so thousands of items can't exist in 1 tile and crash people in the same area. if (from.AddToBackpack(item)) { if (item is SpellScroll) from.SendAsciiMessage("You put the {0} scroll in your pack.", item.Name ?? CliLoc.LocToString(item.LabelNumber)); else from.SendAsciiMessage("You put the {0} in your pack.", item.Name ?? CliLoc.LocToString(item.LabelNumber)); } else if (!item.Deleted) { IPooledEnumerable eable = from.Map.GetItemsInRange(from.Location, 0); int amount = 0; Item toRemove = null; foreach (Item i in eable) { if (i != item && i.ItemID == item.ItemID) { if (i.StackWith(from, item, false)) { toRemove = item; break; } amount++; } } from.SendAsciiMessage("You are overweight and put the {0} on the ground.", item.Name ?? CliLoc.LocToString(item.LabelNumber)); if (toRemove != null) toRemove.Delete(); else if (amount >= 5 && amount < 20) from.LocalOverheadMessage(MessageType.Regular, 906, true, string.Format("{0} identical items on the ground detected, no more than 20 is allowed!", amount)); else if (amount >= 20) { from.LocalOverheadMessage(MessageType.Regular, 906, true, "Too many identical items on the ground, removing!"); item.Delete(); } eable.Free(); } #endregion if (from.AccessLevel > AccessLevel.Player) CommandLogging.WriteLine(from, "Crafting {0} with craft system {1}", CommandLogging.Format(item), craftSystem.GetType().Name); } if (num == 0) num = craftSystem.PlayEndingEffect(from, false, true, toolBroken, endquality, makersMark, this); bool queryFactionImbue = false; int availableSilver = 0; FactionItemDefinition def = null; Faction faction = null; if (item is IFactionItem) { def = FactionItemDefinition.Identify(item); if (def != null) { faction = Faction.Find(from); if (faction != null) { Town town = Town.FromRegion(from.Region); if (town != null && town.Owner == faction) { Container pack = from.Backpack; if (pack != null) { availableSilver = pack.GetAmount(typeof(Silver)); if (availableSilver >= def.SilverCost) queryFactionImbue = Faction.IsNearType(from, def.VendorType, 12); } } } } } // TODO: Scroll imbuing if (queryFactionImbue) from.SendGump(new FactionImbueGump(quality, item, from, craftSystem, tool, num, availableSilver, faction, def)); else if (!tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } else if (!allRequiredSkills) if (!tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, 1044153)); else from.SendLocalizedMessage(1044153); // You don't have the required skills to attempt this item. else { ConsumeType consumeType = (UseAllRes ? ConsumeType.Half : ConsumeType.All); int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, true)) { if (!tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } //tool.UsesRemaining--; if (tool is WeaversSpool) tool.UsesRemaining--; if (tool.UsesRemaining < 1) toolBroken = true; if (toolBroken) tool.Delete(); // SkillCheck failed. int num = craftSystem.PlayEndingEffect(from, true, true, toolBroken, endquality, false, this); if (!tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } }
public void CompleteCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CustomCraft customCraft ) { int badCraft = craftSystem.CanCraft( from, tool, m_Type ); if ( badCraft > 0 ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, badCraft ) ); else from.SendLocalizedMessage( badCraft ); return; } int checkResHue = 0, checkMaxAmount = 0; object checkMessage = null; // Not enough resource to craft it if ( !ConsumeRes( from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, checkMessage ) ); else if ( checkMessage is int && (int)checkMessage > 0 ) from.SendLocalizedMessage( (int)checkMessage ); else if ( checkMessage is string ) from.SendMessage( (string)checkMessage ); return; } else if ( !ConsumeAttributes( from, ref checkMessage, false ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, checkMessage ) ); else if ( checkMessage is int && (int)checkMessage > 0 ) from.SendLocalizedMessage( (int)checkMessage ); else if ( checkMessage is string ) from.SendMessage( (string)checkMessage ); return; } bool toolBroken = false; int ignored = 1; int endquality = 1; bool allRequiredSkills = true; if ( CheckSkills( from, typeRes, craftSystem, ref ignored, ref allRequiredSkills ) ) { // Resource int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if ( !ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, message ) ); else if ( message is int && (int)message > 0 ) from.SendLocalizedMessage( (int)message ); else if ( message is string ) from.SendMessage( (string)message ); return; } else if ( !ConsumeAttributes( from, ref message, true ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, message ) ); else if ( message is int && (int)message > 0 ) from.SendLocalizedMessage( (int)message ); else if ( message is string ) from.SendMessage( (string)message ); return; } tool.UsesRemaining--; if ( craftSystem is DefBlacksmithy ) { AncientSmithyHammer hammer = from.FindItemOnLayer( Layer.OneHanded ) as AncientSmithyHammer; if ( hammer != null && hammer != tool ) { hammer.UsesRemaining--; if ( hammer.UsesRemaining < 1 ) hammer.Delete(); } } if ( tool.UsesRemaining < 1 ) toolBroken = true; if ( toolBroken ) tool.Delete(); int num = 0; Item item; if ( customCraft != null ) { item = customCraft.CompleteCraft( out num ); } else if ( typeof( MapItem ).IsAssignableFrom( ItemType ) && from.Map != Map.Trammel && from.Map != Map.Felucca ) { item = new IndecipherableMap(); from.SendLocalizedMessage( 1070800 ); // The map you create becomes mysteriously indecipherable. } else { item = Activator.CreateInstance( ItemType ) as Item; } if ( item != null ) { if ( item is BaseWeapon ) ((BaseWeapon)item).Identified = true; if ( item is BaseArmor ) ((BaseArmor)item).Identified = true; if ( item is BaseClothing ) ((BaseClothing)item).Identified = true; if ( item is BaseJewel ) ((BaseJewel)item).Identified = true; //For new boards system if ( item is Board ) { Type resourceType = typeRes; if ( resourceType == null ) resourceType = Ressources.GetAt( 0 ).ItemType; CraftResource thisResource = CraftResources.GetFromType( resourceType ); switch ( thisResource ) { case CraftResource.Pine: item = new PineBoard(); break; case CraftResource.Cedar: item = new CedarBoard(); break; case CraftResource.Cherry: item = new CherryBoard(); break; case CraftResource.Mahogany: item = new MahoganyBoard(); break; case CraftResource.Oak: item = new OakBoard(); break; case CraftResource.Ash: item = new AshBoard(); break; case CraftResource.Yew: item = new YewBoard(); break; case CraftResource.Heartwood: item = new HeartwoodBoard(); break; case CraftResource.Bloodwood: item = new BloodwoodBoard(); break; case CraftResource.Frostwood: item = new FrostwoodBoard(); break; default: item = new Board(); break; } } //end for new boards system //For new marble system if ( item is Marble ) { Type resourceType = typeRes; if ( resourceType == null ) resourceType = Ressources.GetAt( 0 ).ItemType; CraftResource thisResource = CraftResources.GetFromType( resourceType ); switch ( thisResource ) { case CraftResource.DullCopper: item = new DullCopperMarble(); break; case CraftResource.ShadowIron: item = new ShadowIronMarble(); break; case CraftResource.Copper: item = new CopperMarble(); break; case CraftResource.Bronze: item = new BronzeMarble(); break; case CraftResource.Gold: item = new GoldMarble(); break; case CraftResource.Agapite: item = new AgapiteMarble(); break; case CraftResource.Verite: item = new VeriteMarble(); break; case CraftResource.Valorite: item = new ValoriteMarble(); break; case CraftResource.Silver: item = new SilverMarble(); break; case CraftResource.Platinum: item = new PlatinumMarble(); break; case CraftResource.Mythril: item = new MythrilMarble(); break; case CraftResource.Obsidian: item = new ObsidianMarble(); break; case CraftResource.Jade: item = new JadeMarble(); break; case CraftResource.Moonstone: item = new MoonstoneMarble(); break; case CraftResource.Sunstone: item = new SunstoneMarble(); break; case CraftResource.Bloodstone: item = new BloodstoneMarble(); break; default: item = new Marble(); break; } } //end for new marble system if( item is ICraftable ) endquality = ((ICraftable)item).OnCraft( quality, makersMark, from, craftSystem, typeRes, tool, this, resHue ); else if ( item.Hue == 0 ) item.Hue = resHue; if ( maxAmount > 0 ) { if ( !item.Stackable && item is IUsesRemaining ) ((IUsesRemaining)item).UsesRemaining *= maxAmount; else item.Amount = maxAmount; } from.AddToBackpack( item ); //from.PlaySound( 0x57 ); } if ( num == 0 ) num = craftSystem.PlayEndingEffect( from, false, true, toolBroken, endquality, makersMark, this ); bool queryFactionImbue = false; int availableSilver = 0; FactionItemDefinition def = null; Faction faction = null; if ( item is IFactionItem ) { def = FactionItemDefinition.Identify( item ); if ( def != null ) { faction = Faction.Find( from ); if ( faction != null ) { Town town = Town.FromRegion( from.Region ); if ( town != null && town.Owner == faction ) { Container pack = from.Backpack; if ( pack != null ) { availableSilver = pack.GetAmount( typeof( Silver ) ); if ( availableSilver >= def.SilverCost ) queryFactionImbue = Faction.IsNearType( from, def.VendorType, 12 ); } } } } } // TODO: Scroll imbuing if ( queryFactionImbue ) from.SendGump( new FactionImbueGump( quality, item, from, craftSystem, tool, num, availableSilver, faction, def ) ); else if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, num ) ); else if ( num > 0 ) from.SendLocalizedMessage( num ); } else if ( !allRequiredSkills ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, 1044153 ) ); else from.SendLocalizedMessage( 1044153 ); // You don't have the required skills to attempt this item. } else { ConsumeType consumeType = ( UseAllRes ? ConsumeType.Half : ConsumeType.All ); int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if ( !ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, true ) ) { if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, message ) ); else if ( message is int && (int)message > 0 ) from.SendLocalizedMessage( (int)message ); else if ( message is string ) from.SendMessage( (string)message ); return; } tool.UsesRemaining--; if ( tool.UsesRemaining < 1 ) toolBroken = true; if ( toolBroken ) tool.Delete(); // SkillCheck failed. int num = craftSystem.PlayEndingEffect( from, true, true, toolBroken, endquality, false, this ); if ( tool != null && !tool.Deleted && tool.UsesRemaining > 0 ) from.SendGump( new CraftGump( from, craftSystem, tool, num ) ); else if ( num > 0 ) from.SendLocalizedMessage( num ); } }
protected override void OnTarget(Mobile from, object targeted) { if (!(targeted is SoftenedReeds) || !((SoftenedReeds)targeted).IsChildOf(from.Backpack)) { from.SendLocalizedMessage(1046439); // That is not a valid target. from.SendLocalizedMessage(1074794); // Target the material to use: from.Target = new ReedsTarget(m_CraftSystem, m_TypeRes, m_Tool, m_CraftItem); } else { from.EndAction(typeof(CraftSystem)); SoftenedReeds reeds = targeted as SoftenedReeds; WeavableBasket basket = (WeavableBasket)Activator.CreateInstance(m_CraftItem.ItemType); bool delete = true; if (!reeds.IsChildOf(from.Backpack)) { // You don't have enough wooden shafts to make that. from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1112246)); } if (from.Backpack == null || from.Backpack.GetAmount(typeof(Shaft)) < basket.NeededShafts) { // You don't have enough wooden shafts to make that. from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1112246)); } else if (SoftenedReeds.GetTotalReeds(from.Backpack, reeds.PlantHue) < basket.NeededReeds) { // You don't have enough of this type of softened reeds to make that. from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1112251)); } else { bool allRequiredSkills = true; double chance = m_CraftItem.GetSuccessChance(from, m_TypeRes, m_CraftSystem, true, ref allRequiredSkills); if (chance > 0.0) { chance += m_CraftItem.GetTalismanBonus(from, m_CraftSystem); } if (allRequiredSkills) { if (chance < Utility.RandomDouble()) { SoftenedReeds.ConsumeReeds(from.Backpack, reeds.PlantHue, basket.NeededReeds / 2); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044043)); // You failed to create the item, and some of your materials are lost. } else { from.Backpack.ConsumeTotal(typeof(Shaft), basket.NeededShafts); SoftenedReeds.ConsumeReeds(from.Backpack, reeds.PlantHue, basket.NeededReeds); basket.Hue = reeds.Hue; from.AddToBackpack(basket); delete = false; bool toolBroken = false; m_Tool.UsesRemaining--; if (m_Tool.UsesRemaining < 1) { toolBroken = true; } if (toolBroken) { m_Tool.Delete(); from.SendLocalizedMessage(1044038); // You have worn out your tool! from.SendLocalizedMessage(1044154); // You create the item. } if (!toolBroken) { // You create the item. from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044154)); } } } else { // You don't have the required skills to attempt this item. from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044153)); } } if (delete) { basket.Delete(); } } }
protected override void OnTarget(Mobile from, object targeted) { if (targeted is LockableContainer) { LockableContainer lc = targeted as LockableContainer; if (lc.Locked) { from.EndAction(typeof(CraftSystem)); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 502943)); // You can only trap an unlocked object. } else if (lc.IsLockedDown) { from.EndAction(typeof(CraftSystem)); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 502944)); // You cannot trap this item because it is locked down. } else if (lc.TrapType != TrapType.None) { from.EndAction(typeof(CraftSystem)); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 502945)); // You can only place one trap on an object at a time. } else if (lc.RootParent != from) { from.EndAction(typeof(CraftSystem)); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 502946)); // That belongs to someone else. } else { object message = null; int maxAmount = 0; bool AllRequiredSkills = true; if (m_craftItem.ConsumeRes(from, m_typeRes, m_CraftSystem, ref m_resHue, ref maxAmount, ConsumeType.All, ref message)) { double chance = m_craftItem.GetSuccessChance(from, m_typeRes, m_CraftSystem, true, ref AllRequiredSkills); if (AllRequiredSkills) { if (chance > Utility.RandomDouble()) { lc.Enabled = true; lc.TrapType = m_Type; switch (m_Type) { case TrapType.DartTrap: lc.TrapPower = Utility.RandomMinMax(50, 70); break; case TrapType.ExplosionTrap: lc.TrapPower = Utility.RandomMinMax(30, 50); break; // at OSI Poison Trap possible no causes direct damage, only poison effect } bool toolBroken = false; m_Tool.UsesRemaining--; if (m_Tool.UsesRemaining < 1) { toolBroken = true; } if (toolBroken) { m_Tool.Delete(); from.SendLocalizedMessage(1044038); // You have worn out your tool! from.SendLocalizedMessage(1005639); // Trap is disabled until you lock the chest. } if (!toolBroken) { from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1005639)); // Trap is disabled until you lock the chest. } } else { from.EndAction(typeof(CraftSystem)); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044043)); // You failed to create the item, and some of your materials are lost. } } else { from.EndAction(typeof(CraftSystem)); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044153)); // You don't have the required skills to attempt this item. } } else { from.EndAction(typeof(CraftSystem)); from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1044253)); // You don't have the components needed to make that. } } } else { from.SendGump(new CraftGump(from, m_CraftSystem, m_Tool, 1005638)); // You can only trap lockable chests. } m_Trap.Delete(); }
public void CompleteCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool) { int badCraft = craftSystem.CanCraft(from, tool, m_Type); if (badCraft > 0) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, badCraft)); else from.SendLocalizedMessage(badCraft); return; } int checkResHue = 0, checkMaxAmount = 0; object checkMessage = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } else if (!ConsumeAttributes(from, ref checkMessage, false)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } bool toolBroken = false; int ignored = 1; int endquality = 1; bool allRequiredSkills = true; // pla, 01/04/07 // ----------------------------------------------------------------- // Additional checks required here to prevent skill gain exploit with special dye tubs. if (craftSystem is DefAlchemy && (ItemType == typeof(SpecialDyeTub) || ItemType == typeof(SpecialDye))) { // note here that if lighten or darken was chosen, there will always be at least one special tub, // as it's set as a resource requirement. if (m_NameString == "> Darken the mix" || m_NameString == "> Lighten the mix") { // darken/lighten requires a special tub // Get list of all special tubs Item[] sdtubs = ((Container)from.Backpack).FindItemsByType(typeof(SpecialDyeTub), true); SpecialDyeTub sdtub; if (sdtubs.Length == 0) { //should be impossible as in reqs return; } else if (sdtubs.Length == 1) { // in this case we have just one tub. This means we will leave skill gain and execution to the // standard craft code below. However, we need to first check if the tub can be lightened/darkened, // and if not then return to prevent skill gain with no resource use. sdtub = (SpecialDyeTub)sdtubs[0]; if (sdtub != null) { if (m_NameString == "> Darken the mix") { if (!sdtub.CanDarken) { from.SendMessage("You attempt to darken the mix, but it will go no darker."); from.SendGump(new CraftGump(from, craftSystem, tool, 0)); return; } } else { if (!sdtub.CanLighten) { from.SendMessage("You attempt to lighten the mix, but it will go no lighter."); from.SendGump(new CraftGump(from, craftSystem, tool, 0)); return; } } } } else if (sdtubs.Length > 1) { // in this case we have more than one possible tub to select so we hand execution over to the target. //target also deals with all skill gain and failure/tool use etc. int resHue = 0; int maxAmount = 0; object message = null; from.SendMessage("Select the dye tub you wish to use for the process."); from.Target = new SpecialDyeTubTarget(this, typeRes, craftSystem, ref resHue, ref maxAmount, ref message, m_NameString, (m_NameString == "> Darken the mix" ? 1 : 2), tool); //and now return to prevent the rest of the code executing return; } } else { // Create/append dye. This can either add to a same coloured special tub, or a fresh non-special tub. // So first we find all the valid tubs... Item[] dtubs = ((Container)from.Backpack).FindItemsByType(typeof(DyeTub), true); int iFound = 0; if (dtubs.Length > 0) { for (int i = 0; i < dtubs.Length; i++) { if (dtubs[i] is SpecialDyeTub) { // Is the same color? if (((SpecialDyeTub)dtubs[i]).StoredColorName == m_NameString && ((SpecialDyeTub)dtubs[i]).Uses < 100 && !((SpecialDyeTub)dtubs[i]).Prepped) { iFound++; } } else { iFound++; } } } if (iFound == 0) { from.SendMessage("You need a fresh dye tub or one that is not yet full and of the same color as the dye you are preparing."); from.SendGump(new CraftGump(from, craftSystem, tool, 0)); return; } else if (iFound == 1) { // once again if no target is required then we just let it fall through } else if (iFound > 1) { //ok in this case we found more than one valid tub so hand execution over to the target and end int resHue = 0; int maxAmount = 0; object message = null; from.SendMessage("Select the dye tub you wish to use for the process."); from.Target = new SpecialDyeTubTarget(this, typeRes, craftSystem, ref resHue, ref maxAmount, ref message, m_NameString, 0, tool); return; } } } // ----------------------------------------------------------------- / //This check is where skill is (possibly) gained! //PLA: 04/06/09 - Prevent skillgain from special tubs entirely if (!(craftSystem is DefAlchemy && (ItemType == typeof(SpecialDyeTub) || ItemType == typeof(SpecialDye)))) { CheckSkills(from, typeRes, craftSystem, ref ignored, ref allRequiredSkills); } if (quality >= 0) { // Resource int resHue = 0; int maxAmount = 0; object message = null; ConsumeType ct = ConsumeType.All; // erl: if this is special dye, forget about consumption for now // .. if (craftSystem is DefAlchemy && (ItemType == typeof(SpecialDyeTub) || ItemType == typeof(SpecialDye))) ct = ConsumeType.None; // .. // Not enough resource to craft it ha if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, ct, ref message)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } if (!ConsumeAttributes(from, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } tool.UsesRemaining--; if (tool.UsesRemaining < 1) toolBroken = true; if (toolBroken) tool.Delete(); // Adam: this is it. Make the item Item item = Activator.CreateInstance(ItemType) as Item; bool bTinkerTrap = false; if (item != null) { // Adam: mark it as PlayerCrafted item.PlayerCrafted = true; if (item is BaseWeapon) { BaseWeapon weapon = (BaseWeapon)item; weapon.Quality = (WeaponQuality)quality; endquality = quality; if (makersMark) weapon.Crafter = from; // Adam: one day we can obsolete and and use item.PlayerCrafted // erl: 10 Nov 05: that day is today! // weapon.PlayerConstructed = true; /*if ( Core.AOS ) { Type resourceType = typeRes; if ( resourceType == null ) resourceType = Ressources.GetAt( 0 ).ItemType; weapon.Resource = CraftResources.GetFromType( resourceType ); CraftContext context = craftSystem.GetContext( from ); if ( context != null && context.DoNotColor ) weapon.Hue = 0; if ( tool is BaseRunicTool ) ((BaseRunicTool)tool).ApplyAttributesTo( weapon ); if ( quality == 2 ) { if ( weapon.Attributes.WeaponDamage > 35 ) weapon.Attributes.WeaponDamage -= 20; else weapon.Attributes.WeaponDamage = 15; } } else */ if (tool is BaseRunicTool) { Type resourceType = typeRes; if (resourceType == null) resourceType = Ressources.GetAt(0).ItemType; CraftResource thisResource = CraftResources.GetFromType(resourceType); if (thisResource == ((BaseRunicTool)tool).Resource) { weapon.Resource = thisResource; CraftContext context = craftSystem.GetContext(from); if (context != null && context.DoNotColor) weapon.Hue = 0; switch (thisResource) { case CraftResource.DullCopper: { weapon.Identified = true; weapon.DurabilityLevel = WeaponDurabilityLevel.Durable; weapon.AccuracyLevel = WeaponAccuracyLevel.Accurate; break; } case CraftResource.ShadowIron: { weapon.Identified = true; weapon.DurabilityLevel = WeaponDurabilityLevel.Durable; weapon.DamageLevel = WeaponDamageLevel.Ruin; break; } case CraftResource.Copper: { weapon.Identified = true; weapon.DurabilityLevel = WeaponDurabilityLevel.Fortified; weapon.DamageLevel = WeaponDamageLevel.Ruin; weapon.AccuracyLevel = WeaponAccuracyLevel.Surpassingly; break; } case CraftResource.Bronze: { weapon.Identified = true; weapon.DurabilityLevel = WeaponDurabilityLevel.Fortified; weapon.DamageLevel = WeaponDamageLevel.Might; weapon.AccuracyLevel = WeaponAccuracyLevel.Surpassingly; break; } case CraftResource.Gold: { weapon.Identified = true; weapon.DurabilityLevel = WeaponDurabilityLevel.Indestructible; weapon.DamageLevel = WeaponDamageLevel.Force; weapon.AccuracyLevel = WeaponAccuracyLevel.Eminently; break; } case CraftResource.Agapite: { weapon.Identified = true; weapon.DurabilityLevel = WeaponDurabilityLevel.Indestructible; weapon.DamageLevel = WeaponDamageLevel.Power; weapon.AccuracyLevel = WeaponAccuracyLevel.Eminently; break; } case CraftResource.Verite: { weapon.Identified = true; weapon.DurabilityLevel = WeaponDurabilityLevel.Indestructible; weapon.DamageLevel = WeaponDamageLevel.Power; weapon.AccuracyLevel = WeaponAccuracyLevel.Exceedingly; break; } case CraftResource.Valorite: { weapon.Identified = true; weapon.DurabilityLevel = WeaponDurabilityLevel.Indestructible; weapon.DamageLevel = WeaponDamageLevel.Vanq; weapon.AccuracyLevel = WeaponAccuracyLevel.Supremely; break; } } } } } else if (item is BaseArmor) { BaseArmor armor = (BaseArmor)item; armor.Quality = (ArmorQuality)quality; endquality = quality; if (makersMark) armor.Crafter = from; Type resourceType = typeRes; if (resourceType == null) resourceType = Ressources.GetAt(0).ItemType; armor.Resource = CraftResources.GetFromType(resourceType); // Adam: one day we can obsolete and and use item.PlayerCrafted // erl: 10 Nov 05: that day is today! // armor.PlayerConstructed = true; CraftContext context = craftSystem.GetContext(from); if (context != null && context.DoNotColor) armor.Hue = 0; if (quality == 2) armor.DistributeBonuses((tool is BaseRunicTool ? 6 : 14)); if (Core.AOS && tool is BaseRunicTool) ((BaseRunicTool)tool).ApplyAttributesTo(armor); } else if (item is FullBookcase || item is FullBookcase2 || item is FullBookcase3) { // Does it now become a ruined bookcase? 5% chance. if (Utility.RandomDouble() > 0.95) { from.SendMessage("You craft the bookcase, but it is ruined."); item.Delete(); item = new RuinedBookcase(); item.Movable = true; } else from.SendMessage("You finish the bookcase and fill it with books."); // Consume single charge from scribe pen... Item[] spens = ((Container)from.Backpack).FindItemsByType(typeof(ScribesPen), true); if (--((ScribesPen)spens[0]).UsesRemaining == 0) { from.SendMessage("You have worn out your tool!"); spens[0].Delete(); } } else if (item is DragonBardingDeed) { DragonBardingDeed deed = (DragonBardingDeed)item; deed.Exceptional = (quality >= 2); endquality = quality; if (makersMark) deed.Crafter = from; Type resourceType = typeRes; if (resourceType == null) resourceType = Ressources.GetAt(0).ItemType; deed.Resource = CraftResources.GetFromType(resourceType); CraftContext context = craftSystem.GetContext(from); if (context != null && context.DoNotColor) deed.Hue = 0; } else if (item is BaseInstrument) { BaseInstrument instrument = (BaseInstrument)item; instrument.Quality = (InstrumentQuality)quality; endquality = quality; if (makersMark) instrument.Crafter = from; } else if (item is BaseJewel) { BaseJewel jewel = (BaseJewel)item; Type resourceType = typeRes; endquality = quality; if (resourceType == null) resourceType = Ressources.GetAt(0).ItemType; jewel.Resource = CraftResources.GetFromType(resourceType); if (1 < Ressources.Count) { resourceType = Ressources.GetAt(1).ItemType; if (resourceType == typeof(StarSapphire)) jewel.GemType = GemType.StarSapphire; else if (resourceType == typeof(Emerald)) jewel.GemType = GemType.Emerald; else if (resourceType == typeof(Sapphire)) jewel.GemType = GemType.Sapphire; else if (resourceType == typeof(Ruby)) jewel.GemType = GemType.Ruby; else if (resourceType == typeof(Citrine)) jewel.GemType = GemType.Citrine; else if (resourceType == typeof(Amethyst)) jewel.GemType = GemType.Amethyst; else if (resourceType == typeof(Tourmaline)) jewel.GemType = GemType.Tourmaline; else if (resourceType == typeof(Amber)) jewel.GemType = GemType.Amber; else if (resourceType == typeof(Diamond)) jewel.GemType = GemType.Diamond; } if (makersMark) jewel.Crafter = from; jewel.Quality = (JewelQuality)quality; } else if (item is BaseClothing) { BaseClothing clothing = (BaseClothing)item; clothing.Quality = (ClothingQuality)quality; endquality = quality; if (makersMark) clothing.Crafter = from; // Adam: one day we can obsolete and and use item.PlayerCrafted // erl: 10 Nov 05: that day is today! // clothing.PlayerConstructed = true; if (item is BaseShoes) { BaseShoes shoes = (BaseShoes)item; if (shoes.Resource != CraftResource.None) { Type resourceType = typeRes; if (resourceType == null) resourceType = Ressources.GetAt(0).ItemType; shoes.Resource = CraftResources.GetFromType(resourceType); CraftContext context = craftSystem.GetContext(from); if (context != null && context.DoNotColor) shoes.Hue = 0; } else { shoes.Hue = resHue; } } else if ((item is BaseGloves) && (resHue == 0)) { clothing.Hue = 1001; // Rhi: The default color for cloth gloves should be white, // not the leather gloves color, which is what it will be if the hue is 0. } else { clothing.Hue = resHue; } // erl: give clothing initial hitpoint values // .. int iMax = clothing.InitMaxHits; int iMin = clothing.InitMinHits; if (clothing.Quality == ClothingQuality.Exceptional) { // Add 50% to both iMax = (iMax * 3) / 2; // Fixed order of precedence bug iMin = (iMin * 3) / 2; // make exceptional clothes newbied clothing.LootType = LootType.Newbied; } else if (clothing.Quality == ClothingQuality.Low) { // Lose 20% to both iMax = (iMax * 4) / 5; // Fixed order of precedence bug iMin = (iMin * 4) / 5; } clothing.HitPoints = clothing.MaxHitPoints = (short)Utility.RandomMinMax(iMin, iMax); // .. } else if (item is BaseTool || item is BaseHarvestTool && quality == 2) { endquality = quality; if (item is BaseTool) ((BaseTool)item).UsesRemaining *= 3; else ((BaseHarvestTool)item).UsesRemaining *= 3; } else if (item is MapItem) { ((MapItem)item).CraftInit(from); } else if (item is LockableContainer) { if (from.CheckSkill(SkillName.Tinkering, -5.0, 15.0)) { LockableContainer cont = (LockableContainer)item; from.SendLocalizedMessage(500636); // Your tinker skill was sufficient to make the item lockable. Key key = new Key(KeyType.Copper, Key.RandomValue()); cont.KeyValue = key.KeyValue; cont.DropItem(key); /* double tinkering = from.Skills[SkillName.Tinkering].Value; int level = (int)(tinkering * 0.8); cont.RequiredSkill = level - 4; cont.LockLevel = level - 14; cont.MaxLockLevel = level + 35; if ( cont.LockLevel == 0 ) cont.LockLevel = -1; else if ( cont.LockLevel > 95 ) cont.LockLevel = 95; if ( cont.RequiredSkill > 95 ) cont.RequiredSkill = 95; if ( cont.MaxLockLevel > 95 ) cont.MaxLockLevel = 95; Commented out by darva to try new tinker lock strength code.*/ double tinkering = from.Skills[SkillName.Tinkering].Value; int level = (int)(tinkering); cont.RequiredSkill = 36; if (level >= 65) cont.RequiredSkill = 76; if (level >= 80) cont.RequiredSkill = 84; if (level >= 90) cont.RequiredSkill = 92; if (level >= 100) cont.RequiredSkill = 100; cont.LockLevel = cont.RequiredSkill - 10; cont.MaxLockLevel = cont.RequiredSkill + 40; } else { from.SendLocalizedMessage(500637); // Your tinker skill was insufficient to make the item lockable. } } else if (item is Runebook) { int charges = 5 + quality + (int)(from.Skills[SkillName.Inscribe].Value / 30); endquality = quality; if (charges > 10) charges = 10; ((Runebook)item).MaxCharges = charges; if (makersMark) ((Runebook)item).Crafter = from; ((Runebook)item).Quality = (RunebookQuality)quality; } else if (item is Bola) { Bola b = (Bola)item; b.Quality = (WeaponQuality)quality; endquality = quality; if (makersMark) b.Crafter = from; } else if (item.Hue == 0) { item.Hue = resHue; } if (maxAmount > 0) item.Amount = maxAmount; // ********************************************** if (craftSystem is DefAlchemy && item is BasePotion) { BasePotion pot = (BasePotion)item; Container pack = from.Backpack; if (pack != null) { Item[] kegs = pack.FindItemsByType(typeof(PotionKeg), true); for (int i = 0; i < kegs.Length; ++i) { PotionKeg keg = kegs[i] as PotionKeg; if (keg == null) continue; if (keg.Held <= 0 || keg.Held >= 100) continue; if (keg.Type != pot.PotionEffect) continue; ++keg.Held; item.Delete(); item = new Bottle(); endquality = -1; // signal placed in keg break; } } } if (craftSystem is DefAlchemy && (item is SpecialDye || item is SpecialDyeTub)) { // Which special dye tub do we want to use? Item[] sdtubs = ((Container)from.Backpack).FindItemsByType(typeof(SpecialDyeTub), true); SpecialDyeTub sdtub; if (m_NameString == "> Darken the mix" || m_NameString == "> Lighten the mix" && sdtubs.Length > 0) { sdtub = (SpecialDyeTub)sdtubs[0]; if (sdtubs.Length > 1) { // Pla, 04/01/07 // This code will never be called now but left it in for sanity. // ----------------------------------------------------------------- // Let the target take over from here //from.Target = new SpecialDyeTubTarget( this, typeRes, craftSystem, ref resHue, ref maxAmount, ref message, ref item, m_NameString, (m_NameString == "> Darken the mix" ? 1 : 2) ); //from.SendMessage("Select the dye tub you wish to use for the process."); } else { int iConsume = 0; if (m_NameString == "> Darken the mix") { if (sdtub.DarkenMix()) { from.SendMessage("You darken the mix with black pearl..."); double dCalc = sdtub.Uses; dCalc /= 5; iConsume = ((int)dCalc) + 1; } else //pla: This will never happen now from.SendMessage("You attempt to darken the mix, but it will go no darker."); } else { if (sdtub.LightenMix()) { from.SendMessage("You lighten the mix with sulfurous ash..."); double dCalc = sdtub.Uses; dCalc /= 5; iConsume = ((int)dCalc) + 1; } else //pla: This will never happen now from.SendMessage("You attempt to lighten the mix, but it will go no lighter."); } for (int i = 0; i < iConsume; i++) ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message); from.PlaySound(0x242); } } else { // Make sure they've got a regular dye tub / a special one of the same color Item[] dtub = ((Container)from.Backpack).FindItemsByType(typeof(DyeTub), true); DyeTub dt = null; int iFound = 0; if (dtub.Length > 0) { for (int i = 0; i < dtub.Length; i++) { if (dtub[i] is SpecialDyeTub) { // Is the same color? if (((SpecialDyeTub)dtub[i]).StoredColorName == m_NameString && ((SpecialDyeTub)dtub[i]).Uses < 100 && !((SpecialDyeTub)dtub[i]).Prepped) { dt = (DyeTub)dtub[i]; iFound++; } continue; } else { dt = (DyeTub)dtub[i]; iFound++; } } } sdtub = (SpecialDyeTub)item; if (dt == null) { from.SendMessage("You need a fresh dye tub or one that is not yet full and of the same color as the dye you are preparing."); sdtub.Delete(); } else { if (iFound > 1) { // Pla, 04/01/07 // This code will never be called now but left it in for sanity // ----------------------------------------------------------------- // Let the target take over from here //from.Target = new SpecialDyeTubTarget( this, typeRes, craftSystem, ref resHue, ref maxAmount, ref message, ref item, m_NameString, 0 ); //from.SendMessage("Select the dye tub you wish to use for the process."); } else { if (dt is SpecialDyeTub) { sdtub.Delete(); ((SpecialDyeTub)dt).Uses++; from.SendMessage("You mix the dye and add it to an existing batch."); } else { sdtub.StoreColor(m_NameString); dt.Delete(); from.SendMessage("You successfully mix the dye."); from.AddToBackpack(item); } ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message); } } } } if (craftSystem is DefTinkering && item is BaseTinkerTrap) { //Need to send target cursor to target //the trappable container bTinkerTrap = true; int power = (int)from.Skills[SkillName.Tinkering].Value + Utility.Random(0, 15); if (power <= 10) power = 10; ((BaseTinkerTrap)item).Power = power; from.SendMessage("Target the container you wish to trap."); from.Target = new TrappableContainerTarget(this, item, craftSystem, toolBroken, tool); } if (!bTinkerTrap && (!(item is SpecialDyeTub || item is SpecialDye))) { from.AddToBackpack(item); } //from.PlaySound( 0x57 ); } if (!bTinkerTrap) { int num = craftSystem.PlayEndingEffect(from, false, true, toolBroken, endquality, makersMark, this); if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } } else if (!allRequiredSkills) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, 1044153)); else from.SendLocalizedMessage(1044153); // You don't have the required skills to attempt this item. } else { ConsumeType consumeType = (UseAllRes ? ConsumeType.Fail : ConsumeType.Half); int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } tool.UsesRemaining--; if (tool.UsesRemaining < 1) toolBroken = true; if (toolBroken) tool.Delete(); // SkillCheck failed. int num = craftSystem.PlayEndingEffect(from, true, true, toolBroken, endquality, false, this); if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } }
public static void DoCraft( Mobile from, CraftSystem system, Type typeRes, BaseTool tool, CraftItem craftItem, PlantPigment pigments ) { CraftContext context = system.GetContext( from ); if ( context != null ) context.OnMade( craftItem ); bool allRequiredSkills = true; double chance = craftItem.GetSuccessChance( from, typeRes, system, true, ref allRequiredSkills ); if ( chance > 0.0 ) chance += craftItem.GetTalismanBonus( from, system ); if ( allRequiredSkills ) { pigments.Consume(); if ( chance < Utility.RandomDouble() ) { from.SendGump( new CraftGump( from, system, tool, 1044043 ) ); // You failed to create the item, and some of your materials are lost. } else { from.Backpack.ConsumeTotal( typeof( ColorFixative ), 1 ); bool toolBroken = false; tool.UsesRemaining--; if ( tool.UsesRemaining < 1 ) toolBroken = true; if ( toolBroken ) { tool.Delete(); from.SendLocalizedMessage( 1044038 ); // You have worn out your tool! from.SendLocalizedMessage( 1044154 ); // You create the item. } else { // You create the item. from.SendGump( new CraftGump( from, system, tool, 1044154 ) ); } from.AddToBackpack( new NaturalDye( pigments.PlantHue ) ); } } else { // You don't have the required skills to attempt this item. from.SendGump( new CraftGump( from, system, tool, 1044153 ) ); } }
public void CompleteCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CustomCraft customCraft) { int badCraft = craftSystem.CanCraft(from, tool, m_Type); if (badCraft > 0) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, badCraft)); else from.SendLocalizedMessage(badCraft); return; } int checkResHue = 0, checkMaxAmount = 0; object checkMessage = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } else if (!ConsumeAttributes(from, ref checkMessage, false)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } bool toolBroken = false; int ignored = 1; int endquality = 1; bool allRequiredSkills = true; if (CheckSkills(from, typeRes, craftSystem, ref ignored, ref allRequiredSkills)) { // Resource int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } else if (!ConsumeAttributes(from, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } tool.UsesRemaining--; if (craftSystem is DefBlacksmithy) { AncientSmithyHammer hammer = from.FindItemOnLayer(Layer.OneHanded) as AncientSmithyHammer; if (hammer != null && hammer != tool) { #region Mondain's Legacy if (hammer is HammerOfHephaestus) { if (hammer.UsesRemaining > 0) hammer.UsesRemaining--; if (hammer.UsesRemaining < 1) from.PlaceInBackpack(hammer); } else { hammer.UsesRemaining--; if (hammer.UsesRemaining < 1) hammer.Delete(); } #endregion } } #region Mondain's Legacy if (tool is HammerOfHephaestus) { if (tool.UsesRemaining < 1) tool.UsesRemaining = 0; } else { if (tool.UsesRemaining < 1) toolBroken = true; if (toolBroken) tool.Delete(); } #endregion int num = 0; Item item; if (customCraft != null) { item = customCraft.CompleteCraft(out num); } else if (typeof(MapItem).IsAssignableFrom(ItemType) && from.Map != Map.Trammel && from.Map != Map.Felucca) { item = new IndecipherableMap(); from.SendLocalizedMessage(1070800); // The map you create becomes mysteriously indecipherable. } else { item = Activator.CreateInstance(ItemType) as Item; } if (item != null) { #region Mondain's Legacy if (item is Board) { Type resourceType = typeRes; if (resourceType == null) resourceType = Resources.GetAt(0).ItemType; CraftResource thisResource = CraftResources.GetFromType(resourceType); switch (thisResource) { case CraftResource.OakWood: item = new OakBoard(); break; case CraftResource.AshWood: item = new AshBoard(); break; case CraftResource.YewWood: item = new YewBoard(); break; case CraftResource.Heartwood: item = new HeartwoodBoard(); break; case CraftResource.Bloodwood: item = new BloodwoodBoard(); break; case CraftResource.Frostwood: item = new FrostwoodBoard(); break; default: item = new Board(); break; } } #endregion if (item is ICraftable) endquality = ((ICraftable)item).OnCraft(quality, makersMark, from, craftSystem, typeRes, tool, this, resHue); else if (item.Hue == 0) item.Hue = resHue; if (maxAmount > 0) { if (!item.Stackable && item is IUsesRemaining) ((IUsesRemaining)item).UsesRemaining *= maxAmount; else item.Amount = maxAmount; } from.AddToBackpack(item); //I Added FOR CRAFTBAG Container craftbag = GetCraftBag(from); if (!craftbag.TryDropItem(from, item, false)) { from.AddToBackpack(item); } //I Added For craftbacg above. The original below //originaly was there above from.AddToBackpack(item); if (from.AccessLevel > AccessLevel.Player) CommandLogging.WriteLine(from, "Crafting {0} with craft system {1}", CommandLogging.Format(item), craftSystem.GetType().Name); //from.PlaySound( 0x57 ); } if (num == 0) num = craftSystem.PlayEndingEffect(from, false, true, toolBroken, endquality, makersMark, this); bool queryFactionImbue = false; int availableSilver = 0; FactionItemDefinition def = null; Faction faction = null; if (item is IFactionItem) { def = FactionItemDefinition.Identify(item); if (def != null) { faction = Faction.Find(from); if (faction != null) { Town town = Town.FromRegion(from.Region); if (town != null && town.Owner == faction) { Container pack = from.Backpack; if (pack != null) { availableSilver = pack.GetAmount(typeof(Silver)); if (availableSilver >= def.SilverCost) queryFactionImbue = Faction.IsNearType(from, def.VendorType, 12); } } } } } // TODO: Scroll imbuing if (queryFactionImbue) from.SendGump(new FactionImbueGump(quality, item, from, craftSystem, tool, num, availableSilver, faction, def)); else if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) //I added for autoloop { CraftContext context = craftSystem.GetContext(from); if (context != null && context.AutoLoop) { context.Count++; if (context.TotalCount == 0 || context.Count < context.TotalCount) { this.Craft(from, craftSystem, typeRes, tool); } else from.SendGump(new CraftGump(from, craftSystem, tool, num)); } else from.SendGump(new CraftGump(from, craftSystem, tool, num)); } //I ADDED autoloop this originaly there from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } else if (!allRequiredSkills) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, 1044153)); else from.SendLocalizedMessage(1044153); // You don't have the required skills to attempt this item. } else { ConsumeType consumeType = (UseAllRes ? ConsumeType.Half : ConsumeType.All); int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } tool.UsesRemaining--; if (tool.UsesRemaining < 1) toolBroken = true; if (toolBroken) tool.Delete(); // SkillCheck failed. int num = craftSystem.PlayEndingEffect(from, true, true, toolBroken, endquality, false, this); if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) //I added auto loop { CraftContext context = craftSystem.GetContext(from); if (context != null && context.AutoLoop) { context.Count++; if (context.TotalCount == 0 || context.Count < context.TotalCount) { this.Craft(from, craftSystem, typeRes, tool); } else from.SendGump(new CraftGump(from, craftSystem, tool, num)); } else from.SendGump(new CraftGump(from, craftSystem, tool, num)); } //I added autoloop this originaly there from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } }
public static void DoCraft(Mobile from, CraftSystem system, Type typeRes, BaseTool tool, CraftItem craftItem, PlantClippings clippings) { CraftContext context = system.GetContext(from); if (context != null) { context.OnMade(craftItem); } bool allRequiredSkills = true; double chance = craftItem.GetSuccessChance(from, typeRes, system, true, ref allRequiredSkills); if (chance > 0.0) { chance += craftItem.GetTalismanBonus(from, system); } if (allRequiredSkills) { clippings.Consume(); if (chance < Utility.RandomDouble()) { from.SendGump(new CraftGump(from, system, tool, 1044043)); // You failed to create the item, and some of your materials are lost. } else { from.Backpack.ConsumeTotal(typeof(Bottle), 1); from.AddToBackpack(new PlantPigment(clippings.PlantHue)); bool toolBroken = false; tool.UsesRemaining--; if (tool.UsesRemaining < 1) { toolBroken = true; } if (toolBroken) { tool.Delete(); from.SendLocalizedMessage(1044038); // You have worn out your tool! from.SendLocalizedMessage(1044154); // You create the item. } else { // You create the item. from.SendGump(new CraftGump(from, system, tool, 1044154)); } } } else { // You don't have the required skills to attempt this item. from.SendGump(new CraftGump(from, system, tool, 1044153)); } }
public void CompleteCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CustomCraft customCraft) { int badCraft = craftSystem.CanCraft(from, tool, m_Type); if (badCraft > 0) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, badCraft)); else from.SendLocalizedMessage(badCraft); return; } int checkResHue = 0, checkMaxAmount = 0; object checkMessage = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } else if (!ConsumeAttributes(from, ref checkMessage, false)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } bool toolBroken = false; int ignored = 1; int endquality = 1; bool allRequiredSkills = true; if (CheckSkills(from, craftSystem, ref ignored, ref allRequiredSkills)) { // Resource int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } else if (!ConsumeAttributes(from, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } tool.UsesRemaining--; if (tool.UsesRemaining < 1 && tool.BreakOnDepletion) toolBroken = true; if (toolBroken) tool.Delete(); int num = 0; Item item; if (customCraft != null) { item = customCraft.CompleteCraft(out num); } else if (typeof(MapItem).IsAssignableFrom(ItemType) && from.Map != Map.Felucca) { item = new IndecipherableMap(); from.SendLocalizedMessage(1070800); // The map you create becomes mysteriously indecipherable. } else { item = Activator.CreateInstance(ItemType) as Item; } if (item != null) { if (item is ICraftable) endquality = ((ICraftable)item).OnCraft(quality, makersMark, from, craftSystem, typeRes, tool, this, resHue); else if (item.Hue == 0) item.Hue = resHue; if (maxAmount > 0) { if (!item.Stackable && item is IUsesRemaining) ((IUsesRemaining)item).UsesRemaining *= maxAmount; else item.Amount = maxAmount; } from.AddToBackpack(item); if (from.AccessLevel > AccessLevel.Player) CommandLogging.WriteLine(from, "Crafting {0} with craft system {1}", CommandLogging.Format(item), craftSystem.GetType().Name); //from.PlaySound( 0x57 ); } if (num == 0) num = craftSystem.PlayEndingEffect(from, false, true, toolBroken, endquality, makersMark, this); if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } else if (!allRequiredSkills) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, 1044153)); else from.SendLocalizedMessage(1044153); // You don't have the required skills to attempt this item. } else { ConsumeType consumeType = (UseAllRes ? ConsumeType.Half : ConsumeType.All); int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } tool.UsesRemaining--; if (tool.UsesRemaining < 1 && tool.BreakOnDepletion) toolBroken = true; if (toolBroken) tool.Delete(); // SkillCheck failed. int num = craftSystem.PlayEndingEffect(from, true, true, toolBroken, endquality, false, this); if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } }
public void CompleteCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CustomCraft customCraft) { int badCraft = craftSystem.CanCraft(from, tool, m_Type); if (badCraft > 0) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, badCraft)); else from.SendLocalizedMessage(badCraft); return; } int checkResHue = 0, checkMaxAmount = 0; object checkMessage = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref checkResHue, ref checkMaxAmount, ConsumeType.None, ref checkMessage)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } else if (!ConsumeAttributes(from, ref checkMessage, false)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, checkMessage)); else if (checkMessage is int && (int)checkMessage > 0) from.SendLocalizedMessage((int)checkMessage); else if (checkMessage is string) from.SendMessage((string)checkMessage); return; } bool toolBroken = false; int ignored = 1; int endquality = 1; bool allRequiredSkills = true; if (CheckSkills(from, typeRes, craftSystem, ref ignored, ref allRequiredSkills)) { // Resource int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.All, ref message)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } else if (!ConsumeAttributes(from, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } tool.UsesRemaining--; if (craftSystem is DefBlacksmithy) { AncientSmithyHammer hammer = from.FindItemOnLayer(Layer.OneHanded) as AncientSmithyHammer; if (hammer != null && hammer != tool) { #region Mondain's Legacy if (hammer is HammerOfHephaestus) { if (hammer.UsesRemaining > 0) hammer.UsesRemaining--; if (hammer.UsesRemaining < 1) from.PlaceInBackpack(hammer); } else { hammer.UsesRemaining--; if (hammer.UsesRemaining < 1) hammer.Delete(); } #endregion } } #region Mondain's Legacy if (tool is HammerOfHephaestus) { if (tool.UsesRemaining < 1) tool.UsesRemaining = 0; } else { if (tool.UsesRemaining < 1) toolBroken = true; if (toolBroken) tool.Delete(); } #endregion int num = 0; Item item; if (customCraft != null) { item = customCraft.CompleteCraft(out num); } else if (typeof(MapItem).IsAssignableFrom(ItemType) && from.Map != Map.Trammel && from.Map != Map.Felucca) { item = new IndecipherableMap(); from.SendLocalizedMessage(1070800); // The map you create becomes mysteriously indecipherable. } else { item = Activator.CreateInstance(ItemType) as Item; } if (item != null) { #region Mondain's Legacy if (item is Board) { Type resourceType = typeRes; if (resourceType == null) resourceType = Ressources.GetAt(0).ItemType; CraftResource thisResource = CraftResources.GetFromType(resourceType); switch (thisResource) { case CraftResource.Oak: item = new OakBoard(); break; case CraftResource.Ash: item = new AshBoard(); break; case CraftResource.Yew: item = new YewBoard(); break; case CraftResource.Heartwood: item = new HeartwoodBoard(); break; case CraftResource.Bloodwood: item = new BloodwoodBoard(); break; case CraftResource.Frostwood: item = new FrostwoodBoard(); break; case CraftResource.Pine: item = new PineBoard(); break; case CraftResource.Cedar: item = new CedarBoard(); break; case CraftResource.Cherry: item = new CherryBoard(); break; case CraftResource.Mahogany: item = new MahoganyBoard(); break; default: item = new Board(); break; } } #endregion if (item is ICraftable) endquality = ((ICraftable)item).OnCraft(quality, makersMark, from, craftSystem, typeRes, tool, this, resHue); else if (item.Hue == 0) item.Hue = resHue; if (maxAmount > 0) { if (!item.Stackable && item is IUsesRemaining) ((IUsesRemaining)item).UsesRemaining *= maxAmount; else item.Amount = maxAmount; } #region Plant Pigments if( item is PlantPigment && ( craftSystem is DefAlchemy || craftSystem is DefCooking ) ) { ((PlantPigment)item).PigmentHue = PlantPigmentHueInfo.HueFromPlantHue(m_PlantHue); } if( item is NaturalDye && ( craftSystem is DefAlchemy || craftSystem is DefCooking ) ) { ((NaturalDye)item).PigmentHue = PlantPigmentHueInfo.GetInfo(m_PlantPigmentHue).PlantPigmentHue; } if (item is SoftenedReeds && (craftSystem is DefAlchemy || craftSystem is DefCooking)) { ((SoftenedReeds)item).PlantHue = PlantHueInfo.GetInfo(this.m_PlantHue).PlantHue; } if (item is BaseContainer && (craftSystem is DefBasketweaving)) { ((BaseContainer)item).Hue = PlantHueInfo.GetInfo(this.m_PlantHue).Hue; } #endregion from.AddToBackpack(item); //typeres amount quality Type resourceType = typeRes; if (!m_UseAllRes) { int m_TokensAmount = 1; if (typeRes != null) { CraftResource thisResource = CraftResources.GetFromType(typeRes); switch (thisResource) { default: m_TokensAmount *= 1; break; case CraftResource.SpinedLeather: m_TokensAmount *= 2; break; case CraftResource.HornedLeather: m_TokensAmount *= 3; break; case CraftResource.BarbedLeather: m_TokensAmount *= 4; break; case CraftResource.DaemonLeather: m_TokensAmount *= 5; break; case CraftResource.DragonLeather: m_TokensAmount *= 6; break; //case CraftResource.BlazeLeather: i_TokensAmount *= 7; break; //case CraftResource.DaemonicLeather: i_TokensAmount *= 8; break; //case CraftResource.ShadowLeather: i_TokensAmount *= 9; break; //case CraftResource.FrostLeather: i_TokensAmount *= 10; break; //case CraftResource.EtherealLeather: i_TokensAmount *= 11; break; case CraftResource.DullCopper: m_TokensAmount *= 2; break; case CraftResource.ShadowIron: m_TokensAmount *= 3; break; case CraftResource.Copper: m_TokensAmount *= 4; break; case CraftResource.Bronze: m_TokensAmount *= 5; break; case CraftResource.Gold: m_TokensAmount *= 6; break; case CraftResource.Agapite: m_TokensAmount *= 7; break; case CraftResource.Verite: m_TokensAmount *= 8; break; case CraftResource.Valorite: m_TokensAmount *= 9; break; case CraftResource.Silver: m_TokensAmount *= 10; break; case CraftResource.Jade: m_TokensAmount *= 11; break; case CraftResource.Moonstone: m_TokensAmount *= 12; break; case CraftResource.Sunstone: m_TokensAmount *= 13; break; //case CraftResource.Platinum: i_TokensAmount *= 14; break; case CraftResource.RedScales: m_TokensAmount *= 2; break; case CraftResource.YellowScales: m_TokensAmount *= 3; break; case CraftResource.BlackScales: m_TokensAmount *= 4; break; case CraftResource.GreenScales: m_TokensAmount *= 5; break; case CraftResource.WhiteScales: m_TokensAmount *= 6; break; case CraftResource.BlueScales: m_TokensAmount *= 7; break; //case CraftResource.CopperScales: i_TokensAmount *= 8; break; //case CraftResource.SilverScales: i_TokensAmount *= 9; break; //case CraftResource.GoldScales: i_TokensAmount *= 10; break; case CraftResource.Pine: m_TokensAmount *= 2; break; case CraftResource.Oak: m_TokensAmount *= 3; break; case CraftResource.Ash: m_TokensAmount *= 4; break; case CraftResource.Yew: m_TokensAmount *= 5; break; //case CraftResource.Oak: m_TokensAmount *= 6; break; case CraftResource.Cherry: m_TokensAmount *= 7; break; case CraftResource.Cedar: m_TokensAmount *= 8; break; case CraftResource.Mahogany: m_TokensAmount *= 9; break; // case CraftResource.PurpleHeart: i_TokensAmount *= 10; break; // case CraftResource.Redwood: i_TokensAmount *= 11; break; // case CraftResource.Petrified: i_TokensAmount *= 12; break; case CraftResource.Heartwood: m_TokensAmount *= 10; break; case CraftResource.Bloodwood: m_TokensAmount *= 11; break; case CraftResource.Frostwood: m_TokensAmount *= 12; break; } } m_TokensAmount *= Ressources.GetAt(0).Amount; double tok = m_TokensAmount; if (quality == 2) tok *= 1.35; tok /= 8; if (tok >= 1) m_TokensAmount = (int)tok; else m_TokensAmount = 1; TokenValidate.RewardTokens(from, m_TokensAmount); } if (from.AccessLevel > AccessLevel.Player) CommandLogging.WriteLine(from, "Crafting {0} with craft system {1}", CommandLogging.Format(item), craftSystem.GetType().Name); //from.PlaySound( 0x57 ); } if (num == 0) num = craftSystem.PlayEndingEffect(from, false, true, toolBroken, endquality, makersMark, this); bool queryFactionImbue = false; int availableSilver = 0; FactionItemDefinition def = null; Faction faction = null; if (item is IFactionItem) { def = FactionItemDefinition.Identify(item); if (def != null) { faction = Faction.Find(from); if (faction != null) { Town town = Town.FromRegion(from.Region); if (town != null && town.Owner == faction) { Container pack = from.Backpack; if (pack != null) { availableSilver = pack.GetAmount(typeof(Silver)); if (availableSilver >= def.SilverCost) queryFactionImbue = Faction.IsNearType(from, def.VendorType, 12); } } } } } // TODO: Scroll imbuing if (queryFactionImbue) from.SendGump(new FactionImbueGump(quality, item, from, craftSystem, tool, num, availableSilver, faction, def)); else if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } else if (!allRequiredSkills) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, 1044153)); else from.SendLocalizedMessage(1044153); // You don't have the required skills to attempt this item. } else { ConsumeType consumeType = (UseAllRes ? ConsumeType.Half : ConsumeType.All); int resHue = 0; int maxAmount = 0; object message = null; // Not enough resource to craft it if (!ConsumeRes(from, typeRes, craftSystem, ref resHue, ref maxAmount, consumeType, ref message, true)) { if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, message)); else if (message is int && (int)message > 0) from.SendLocalizedMessage((int)message); else if (message is string) from.SendMessage((string)message); return; } tool.UsesRemaining--; if (tool.UsesRemaining < 1) toolBroken = true; if (toolBroken) tool.Delete(); // SkillCheck failed. int num = craftSystem.PlayEndingEffect(from, true, true, toolBroken, endquality, false, this); if (tool != null && !tool.Deleted && tool.UsesRemaining > 0) from.SendGump(new CraftGump(from, craftSystem, tool, num)); else if (num > 0) from.SendLocalizedMessage(num); } }