View Full Version: Comment tuer le système de qualité ?

RunUO.FR Support > comment on fait ... > Comment tuer le système de qualité ?


Title: Comment tuer le système de qualité ?


Lokscander - September 14, 2004 03:53 AM (GMT)
Salut,

Voilà maintenant une ou deux heures que je passe à essayer de tuer les divers système de Run UO afin de pouvoir scripter les systèmes propres à Tarsia.

Mais malheureusement, je viens de tomber sur un boulet : Je n'arrive pas à tuer le système de qualité de Run UO.

Par système de qualité, je veux dire le système qui permet de faire des items de qualité poche, de qualité normale et de qualité "Exceptionnal" sur UO.

Ce que je veux faire, c'est retirer toute trace de ce système de qualité afin de pouvoir en scripter un tout neuf.

J'ai regardé dans tous les fichiers du dossier Engimes mais je n'arrive pas à trouver la source même de la notion de qualité.

Quelqu'un serait-il capable de m'indiquer le fichier/les lignes d'un fichier que je dois retirer ?

Merci d'avance,
Loks

Belladonne - September 14, 2004 08:57 AM (GMT)
J'en ai vu un petit bout en passant dans craftitem qui gere les qualités exeptionnelles dans CraftItem , fonction checkSkills... cherche peut etre dans le coin .

Lokscander - September 14, 2004 10:07 PM (GMT)
J'Ai presque réussit à tout le détruire... merci de ton aide Belladonne. c'était en effet dans le Craft Item et éparpillé un peu partout. Mais voilà que j'ai cette erreure

QUOTE
Scripts: Compiling C# scripts...failed (3 errors, 0 warnings)
- Error: Scripts\Engines\Craft\Core\CraftItem.cs: CS1520: (line 34, column 10)
Class, struct, or interface method must have a return type
- Error: Scripts\Engines\Craft\Core\CraftItem.cs: CS1520: (line 46, column 10)
Class, struct, or interface method must have a return type
- Error: Scripts\Engines\Craft\Core\CraftItem.cs: CS1520: (line 58, column 10)
Class, struct, or interface method must have a return type
Scripts: One or more scripts failed to compile or no script files were found.
- Press return to exit, or R to try again.


Ce qui veut dire ? *est débutant en scriptage*

Vortal - September 14, 2004 10:23 PM (GMT)
Bah heu.. *débutant également*

Ce que ça peut vouloir dire d'après moi, c'est qu'il y a quelque part une fonction qui fait appel à ce code et que cette fonction s'attend à recevoir une variable (int, string ou autre) quelconque.. Sans le code, c'est difficile à dire.

Lokscander - September 15, 2004 04:41 AM (GMT)
Ce que j'ai fait, c'est deleter toute trace de GetExceptionnalchance et ce que j'ai "compris" qui avait rapport avec cela dans tous les scripts de crafting. Jusque là, tout marche comme sur des roulettes (j'ai pas d'erreure là dessus), sauf pour la variable quality.

J'ai ensuite deleté toute trace de la variable Quality dans ce script (c'est le seul script qui l'a apparement)... sauf à quelques endroits où c'est à coté d'un public bool ou public void, j'me suis dit que ca devait être important si c'est là.

J'ai ensuite remplacé ce qui déterminait la variable quality par quality = 1; puisque ca me disait comme erreure que la variable quality n'existait pas si je mettais rien.


CraftItem.cs
CODE
using System;
using Server.Items;

namespace Server.Engines.Craft
{
public enum ConsumeType
{
 All, Half, None
}

public class CraftItem7
{
 private CraftResCol m_arCraftRes;
 private CraftSkillCol m_arCraftSkill;
 private Type m_Type;

 private string m_GroupNameString;
 private int m_GroupNameNumber;

 private string m_NameString;
 private int m_NameNumber;
 
 private int m_Mana;
 private int m_Hits;
 private int m_Stam;

 private bool m_UseAllRes;

 private bool m_NeedHeat;
 private bool m_NeedOven;

 private bool m_UseSubRes2;

 public CraftItem( Type type, string groupName, string name )
 {
  m_arCraftRes = new CraftResCol();
  m_arCraftSkill = new CraftSkillCol();

  m_Type = type;
  m_GroupNameString = groupName;
  m_NameString = name;
 }

 public CraftItem( Type type, int groupName, int name )
 {
  m_arCraftRes = new CraftResCol();
  m_arCraftSkill = new CraftSkillCol();

  m_Type = type;
  m_GroupNameNumber = groupName;
  m_NameNumber = name;
 }

 public CraftItem( Type type, int groupName, string name )
 {
  m_arCraftRes = new CraftResCol();
  m_arCraftSkill = new CraftSkillCol();

  m_Type = type;
  m_GroupNameNumber = groupName;
  m_NameString = name;
 }

 public void AddRes( Type type, int name, int amount )
 {
  AddRes( type, name, amount, "" );
 }

 public void AddRes( Type type, int name, int amount, int localizedMessage )
 {
  CraftRes craftRes = new CraftRes( type, name, amount, localizedMessage );
  m_arCraftRes.Add( craftRes );
 }

 public void AddRes( Type type, int name, int amount, string strMessage )
 {
  CraftRes craftRes = new CraftRes( type, name, amount, strMessage );
  m_arCraftRes.Add( craftRes );
 }

 public void AddRes( Type type, string name, int amount )
 {
  AddRes( type, name, amount, "" );
 }

 public void AddRes( Type type, string name, int amount, int localizedMessage )
 {
  CraftRes craftRes = new CraftRes( type, name, amount, localizedMessage );
  m_arCraftRes.Add( craftRes );
 }

 public void AddRes( Type type, string name, int amount, string strMessage )
 {
  CraftRes craftRes = new CraftRes( type, name, amount, strMessage );
  m_arCraftRes.Add( craftRes );
 }

 public void AddSkill( SkillName skillToMake, double minSkill, double maxSkill )
 {
  CraftSkill craftSkill = new CraftSkill( skillToMake, minSkill, maxSkill );
  m_arCraftSkill.Add( craftSkill );
 }

 public int Mana
 {
  get { return m_Mana; }
  set { m_Mana = value; }
 }

 public int Hits
 {
  get { return m_Hits; }
  set { m_Hits = value; }
 }

 public int Stam
 {
  get { return m_Stam; }
  set { m_Stam = value; }
 }

 public bool UseSubRes2
 {
  get { return m_UseSubRes2; }
  set { m_UseSubRes2 = value; }
 }

 public bool UseAllRes
 {
  get { return m_UseAllRes; }
  set { m_UseAllRes = value; }
 }

 public bool NeedHeat
 {
  get { return m_NeedHeat; }
  set { m_NeedHeat = value; }
 }

 public bool NeedOven
 {
  get { return m_NeedOven; }
  set { m_NeedOven = value; }
 }
 
 public Type ItemType
 {
  get { return m_Type; }
 }

 public string GroupNameString
 {
  get { return m_GroupNameString; }
 }

 public int GroupNameNumber
 {
  get { return m_GroupNameNumber; }
 }

 public string NameString
 {
  get { return m_NameString; }
 }

 public int NameNumber
 {
  get { return m_NameNumber; }
 }

 public CraftResCol Ressources
 {
  get { return m_arCraftRes; }
 }

 public CraftSkillCol Skills
 {
  get { return m_arCraftSkill; }
 }

 public bool ConsumeAttributes( Mobile from, ref object message, bool consume )
 {
  bool consumMana = false;
  bool consumHits = false;
  bool consumStam = false;

  if ( Hits > 0 && from.Hits < Hits )
  {
   message = "You lack the required hit points to make that.";
   return false;
  }
  else
  {
   consumHits = consume;
  }

  if ( Mana > 0 && from.Mana < Mana )
  {
   message = "You lack the required mana to make that.";
   return false;
  }
  else
  {
   consumMana = consume;
  }

  if ( Stam > 0 && from.Stam < Stam )
  {
   message = "You lack the required stamina to make that.";
   return false;
  }
  else
  {
   consumStam = consume;
  }

  if ( consumMana )
   from.Mana -= Mana;

  if ( consumHits )
   from.Hits -= Hits;

  if ( consumStam )
   from.Stam -= Stam;

  return true;
 }

 private static Type[][] m_TypesTable = new Type[][]
  {
   new Type[]{ typeof( Log ), typeof( Board ) },
   new Type[]{ typeof( Leather ), typeof( Hides ) },
   new Type[]{ typeof( SpinedLeather ), typeof( SpinedHides ) },
   new Type[]{ typeof( HornedLeather ), typeof( HornedHides ) },
   new Type[]{ typeof( BarbedLeather ), typeof( BarbedHides ) },
   new Type[]{ typeof( BlankMap ), typeof( BlankScroll ) },
   new Type[]{ typeof( Cloth ), typeof( UncutCloth ) },
   new Type[]{ typeof( CheeseWheel ), typeof( CheeseWedge ) }
  };

 private static Type[] m_ColoredItemTable = new Type[]
  {
   typeof( BaseWeapon ), typeof( BaseArmor ), typeof( BaseClothing ),
   typeof( BaseJewel ), typeof( DragonBardingDeed )
  };

 private static Type[] m_ColoredResourceTable = new Type[]
  {
   typeof( BaseIngot ), typeof( BaseOre ),
   typeof( BaseLeather ), typeof( BaseHides ),
   typeof( UncutCloth ), typeof( Cloth ),
   typeof( BaseGranite ), typeof( BaseScales )
  };

 public bool RetainsColorFrom( CraftSystem system, Type type )
 {
  if ( system.RetainsColorFrom( this, type ) )
   return true;

  bool inItemTable = false, inResourceTable = false;

  for ( int i = 0; !inItemTable && i < m_ColoredItemTable.Length; ++i )
   inItemTable = ( m_Type == m_ColoredItemTable[i] || m_Type.IsSubclassOf( m_ColoredItemTable[i] ) );

  for ( int i = 0; inItemTable && !inResourceTable && i < m_ColoredResourceTable.Length; ++i )
   inResourceTable = ( type == m_ColoredResourceTable[i] || type.IsSubclassOf( m_ColoredResourceTable[i] ) );

  return ( inItemTable && inResourceTable );
 }

 private static int[] m_HeatSources = new int[]
  {
   0x461, 0x48E, // Sandstone oven/fireplace
   0x92B, 0x96C, // Stone oven/fireplace
   0xDE3, 0xDE9, // Campfire
   0xFAC, 0xFAC, // Firepit
   0x184A, 0x184C, // Heating stand (left)
   0x184E, 0x1850, // Heating stand (right)
   0x398C, 0x399F  // Fire field
  };

 private static int[] m_Ovens = new int[]
  {
   0x461, 0x46F, // Sandstone oven
   0x92B, 0x93F  // Stone oven
  };

 public bool Find( Mobile from, int[] itemIDs )
 {
  Map map = from.Map;

  if ( map == null )
   return false;

  IPooledEnumerable eable = map.GetItemsInRange( from.Location, 2 );

  foreach ( Item item in eable )
  {
   if ( (item.Z + 16) > from.Z && (from.Z + 16) > item.Z && Find( item.ItemID, itemIDs ) )
   {
    eable.Free();
    return true;
   }
  }

  eable.Free();

  for ( int x = -2; x <= 2; ++x )
  {
   for ( int y = -2; y <= 2; ++y )
   {
    int vx = from.X + x;
    int vy = from.Y + y;

    Tile[] tiles = map.Tiles.GetStaticTiles( vx, vy, true );

    for ( int i = 0; i < tiles.Length; ++i )
    {
     int z = tiles[i].Z;
     int id = tiles[i].ID & 0x3FFF;

     if ( (z + 16) > from.Z && (from.Z + 16) > z && Find( id, itemIDs ) )
      return true;
    }
   }
  }

  return false;
 }

 public bool Find( int itemID, int[] itemIDs )
 {
  bool contains = false;

  for ( int i = 0; !contains && i < itemIDs.Length; i += 2 )
   contains = ( itemID >= itemIDs[i] && itemID <= itemIDs[i + 1] );

  return contains;
 }

 public bool IsQuantityType( Type[][] types )
 {
  for ( int i = 0; i < types.Length; ++i )
  {
   Type[] check = types[i];

   for ( int j = 0; j < check.Length; ++j )
   {
    if ( typeof( IHasQuantity ).IsAssignableFrom( check[j] ) )
     return true;
   }
  }

  return false;
 }

 public int ConsumeQuantity( Container cont, Type[][] types, int[] amounts )
 {
  if ( types.Length != amounts.Length )
   throw new ArgumentException();

  Item[][] items = new Item[types.Length][];
  int[] totals = new int[types.Length];

  for ( int i = 0; i < types.Length; ++i )
  {
   items[i] = cont.FindItemsByType( types[i], true );

   for ( int j = 0; j < items[i].Length; ++j )
   {
    IHasQuantity hq = items[i][j] as IHasQuantity;

    if ( hq == null )
    {
     totals[i] += items[i][j].Amount;
    }
    else
    {
     if ( hq is BaseBeverage && ((BaseBeverage)hq).Content != BeverageType.Water )
      continue;

     totals[i] += hq.Quantity;
    }
   }

   if ( totals[i] < amounts[i] )
    return i;
  }

  for ( int i = 0; i < types.Length; ++i )
  {
   int need = amounts[i];

   for ( int j = 0; j < items[i].Length; ++j )
   {
    Item item = items[i][j];
    IHasQuantity hq = item as IHasQuantity;

    if ( hq == null )
    {
     int theirAmount = item.Amount;

     if ( theirAmount < need )
     {
      item.Delete();
      need -= theirAmount;
     }
     else
     {
      item.Consume( need );
      break;
     }
    }
    else
    {
     if ( hq is BaseBeverage && ((BaseBeverage)hq).Content != BeverageType.Water )
      continue;

     int theirAmount = hq.Quantity;

     if ( theirAmount < need )
     {
      hq.Quantity -= theirAmount;
      need -= theirAmount;
     }
     else
     {
      hq.Quantity -= need;
      break;
     }
    }
   }
  }

  return -1;
 }

 public int GetQuantity( Container cont, Type[] types )
 {
  Item[] items = cont.FindItemsByType( types, true );

  int amount = 0;

  for ( int i = 0; i < items.Length; ++i )
  {
   IHasQuantity hq = items[i] as IHasQuantity;

   if ( hq == null )
   {
    amount += items[i].Amount;
   }
   else
   {
    if ( hq is BaseBeverage && ((BaseBeverage)hq).Content != BeverageType.Water )
     continue;

    amount += hq.Quantity;
   }
  }

  return amount;
 }

 public bool ConsumeRes( Mobile from, Type typeRes, CraftSystem craftSystem, ref int resHue, ref int maxAmount, ConsumeType consumeType, ref object message )
 {
  Container ourPack = from.Backpack;

  if ( ourPack == null )
   return false;

  if ( m_NeedHeat && !Find( from, m_HeatSources ) )
  {
   message = 1044487; // You must be near a fire source to cook.
   return false;
  }

  if ( m_NeedOven && !Find( from, m_Ovens ) )
  {
   message = 1044493; // You must be near an oven to bake that.
   return false;
  }

  Type[][] types = new Type[m_arCraftRes.Count][];
  int[] amounts = new int[m_arCraftRes.Count];

  maxAmount = int.MaxValue;

  CraftSubResCol resCol = ( m_UseSubRes2 ? craftSystem.CraftSubRes2 : craftSystem.CraftSubRes );

  for ( int i = 0; i < types.Length; ++i )
  {
   CraftRes craftRes = m_arCraftRes.GetAt( i );
   Type baseType = craftRes.ItemType;

   // Resource Mutation
   if ( (baseType == resCol.ResType) && ( typeRes != null ) )
   {
    baseType = typeRes;

    CraftSubRes subResource = resCol.SearchFor( baseType );

    if ( subResource != null && from.Skills[craftSystem.MainSkill].Base < subResource.RequiredSkill )
    {
     message = subResource.Message;
     return false;
    }
   }
   // ******************

   for ( int j = 0; types[i] == null && j < m_TypesTable.Length; ++j )
   {
    if ( m_TypesTable[j][0] == baseType )
     types[i] = m_TypesTable[j];
   }

   if ( types[i] == null )
    types[i] = new Type[]{ baseType };

   /*if ( !retainedColor && RetainsColorFrom( craftSystem, baseType ) )
   {
    retainedColor = true;
    Item resItem = ourPack.FindItemByType( types[i] );

    if ( resItem != null )
     resHue = resItem.Hue;
   }*/

   amounts[i] = craftRes.Amount;

   // For stackable items that can ben crafted more than one at a time
   if ( UseAllRes )
   {
    int tempAmount = ourPack.GetAmount( types[i] );
    tempAmount /= amounts[i];
    if ( tempAmount < maxAmount )
    {
     maxAmount = tempAmount;

     if ( maxAmount == 0 )
     {
      CraftRes res = m_arCraftRes.GetAt( i );

      if ( res.MessageNumber > 0 )
       message = res.MessageNumber;
      else if ( res.MessageString != null && res.MessageString != String.Empty )
       message = res.NameString;
      else
       message = 502925; // You don't have the resources required to make that item.

      return false;
     }
    }
   }
   // ****************************
  }

  // We adjust the amount of each resource to consume the max posible
  if ( UseAllRes )
  {
   for ( int i = 0; i < amounts.Length; ++i )
    amounts[i] *= maxAmount;
  }
  else
   maxAmount = -1;

  Item consumeExtra = null;

  if ( m_NameNumber == 1041267 )
  {
   // Runebooks are a special case, they need a blank recall rune

   Item[] runes = ourPack.FindItemsByType( typeof( RecallRune ) );

   for ( int i = 0; i < runes.Length; ++i )
   {
    RecallRune rune = runes[i] as RecallRune;

    if ( rune != null && !rune.Marked )
    {
     consumeExtra = rune;
     break;
    }
   }

   if ( consumeExtra == null )
   {
    message = 1044253; // You don't have the components needed to make that.
    return false;
   }
  }
 
  int index = 0;

  // Consume ALL
  if ( consumeType == ConsumeType.All )
  {
   m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;

   if ( IsQuantityType( types ) )
    index = ConsumeQuantity( ourPack, types, amounts );
   else
    index = ourPack.ConsumeTotalGrouped( types, amounts, true, new OnItemConsumed( OnResourceConsumed ), new CheckItemGroup( CheckHueGrouping ) );

   resHue = m_ResHue;
  }

  // Consume Half ( for use all resource craft type )
  else if ( consumeType == ConsumeType.Half )
  {
   for ( int i = 0; i < amounts.Length; i++ )
   {
    amounts[i] /= 2;

    if ( amounts[i] < 1 )
     amounts[i] = 1;
   }

   m_ResHue = 0; m_ResAmount = 0; m_System = craftSystem;

   if ( IsQuantityType( types ) )
    index = ConsumeQuantity( ourPack, types, amounts );
   else
    index = ourPack.ConsumeTotalGrouped( types, amounts, true, new OnItemConsumed( OnResourceConsumed ), new CheckItemGroup( CheckHueGrouping ) );

   resHue = m_ResHue;
  }

  else // ConstumeType.None ( it's basicaly used to know if the crafter has enough resource before starting the process )
  {
   index = -1;

   if ( IsQuantityType( types ) )
   {
    for ( int i = 0; i < types.Length; i++ )
    {
     if ( GetQuantity( ourPack, types[i] ) < amounts[i] )
     {
      index = i;
      break;
     }
    }
   }
   else
   {
    for ( int i = 0; i < types.Length; i++ )
    {
     if ( ourPack.GetBestGroupAmount( types[i], true, new CheckItemGroup( CheckHueGrouping ) ) < amounts[i] )
     {
      index = i;
      break;
     }
    }
   }
  }

  if ( index == -1 )
  {
   if ( consumeType != ConsumeType.None )
    if ( consumeExtra != null )
     consumeExtra.Delete();

   return true;
  }
  else
  {
   CraftRes res = m_arCraftRes.GetAt( index );

   if ( res.MessageNumber > 0 )
    message = res.MessageNumber;
   else if ( res.MessageString != null && res.MessageString != String.Empty )
    message = res.NameString;
   else
    message = 502925; // You don't have the resources required to make that item.

   return false;
  }
 }

 private int m_ResHue;
 private int m_ResAmount;
 private CraftSystem m_System;

 private void OnResourceConsumed( Item item, int amount )
 {
  if ( !RetainsColorFrom( m_System, item.GetType() ) )
   return;

  if ( amount >= m_ResAmount )
  {
   m_ResHue = item.Hue;
   m_ResAmount = amount;
  }
 }

 private int CheckHueGrouping( Item a, Item b )
 {
  return b.Hue.CompareTo( a.Hue );
 }

 public double GetSuccessChance( Mobile from, Type typeRes, CraftSystem craftSystem, bool gainSkills, ref bool allRequiredSkills )
 {
  double minMainSkill = 0.0;
  double maxMainSkill = 0.0;
  double valMainSkill = 0.0;

  allRequiredSkills = true;

  for ( int i = 0; i < m_arCraftSkill.Count; i++)
  {
   CraftSkill craftSkill = m_arCraftSkill.GetAt(i);

   double minSkill = craftSkill.MinSkill;
   double maxSkill = craftSkill.MaxSkill;
   double valSkill = from.Skills[craftSkill.SkillToMake].Value;

   if ( valSkill < minSkill )
    allRequiredSkills = false;

   if ( craftSkill.SkillToMake == craftSystem.MainSkill )
   {
    minMainSkill = minSkill;
    maxMainSkill = maxSkill;
    valMainSkill = valSkill;
   }

   if ( gainSkills ) // This is a passive check. Success chance is entirely dependant on the main skill
    from.CheckSkill( craftSkill.SkillToMake, minSkill, maxSkill );
  }
 }

 public void Craft( Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool )
 {
  if ( from.BeginAction( typeof( CraftSystem ) ) )
  {
   bool allRequiredSkills = true;

   if ( allRequiredSkills && chance >= 0.0 )
   {
    int badCraft = craftSystem.CanCraft( from, tool, m_Type );

    if ( badCraft <= 0 )
    {
     int resHue = 0;
     int maxAmount = 0;
     object message = null;

     if ( ConsumeRes( from, typeRes, craftSystem, ref resHue, ref maxAmount, ConsumeType.None, ref message ) )
     {
      message = null;

      if ( ConsumeAttributes( from, ref message, false ) )
      {
       CraftContext context = craftSystem.GetContext( from );

       if ( context != null )
        context.OnMade( this );

       int iMin = craftSystem.MinCraftEffect;
       int iMax = ( craftSystem.MaxCraftEffect - iMin ) + 1;
       int iRandom = Utility.Random( iMax );
       iRandom += iMin + 1;
       new InternalTimer( from, craftSystem, this, typeRes, tool, iRandom ).Start();
      }
      else
      {
       from.EndAction( typeof( CraftSystem ) );
       from.SendGump( new CraftGump( from, craftSystem, tool, message ) );
      }
     }
     else
     {
      from.EndAction( typeof( CraftSystem ) );
      from.SendGump( new CraftGump( from, craftSystem, tool, message ) );
     }
    }
    else
    {
     from.EndAction( typeof( CraftSystem ) );
     from.SendGump( new CraftGump( from, craftSystem, tool, badCraft ) );
    }
   }
   else
   {
    from.EndAction( typeof( CraftSystem ) );
    from.SendGump( new CraftGump( from, craftSystem, tool, 1044153 ) ); // You don't have the required skills to attempt this item.
   }
  }
  else
  {
   from.SendLocalizedMessage( 500119 ); // You must wait to perform another action
  }
 }

 public bool CheckSkills( Mobile from, Type typeRes, CraftSystem craftSystem, ref int quality, ref bool allRequiredSkills )
 {
  return CheckSkills( from, typeRes, craftSystem, ref quality, ref allRequiredSkills, true );
 }

 public bool CheckSkills( Mobile from, Type typeRes, CraftSystem craftSystem, ref int quality, ref bool allRequiredSkills, bool gainSkills )
 {

 public bool CheckSkills( Mobile from, Type typeRes, CraftSystem craftSystem, ref int quality, ref bool allRequiredSkills, bool gainSkills )
 {
  double chance = GetSuccessChance( from, typeRes, craftSystem, gainSkills, ref allRequiredSkills );

                      quality = 1;

  return ( chance >= Utility.RandomDouble() );
 }


 public void CompleteCraft( 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;

  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 ( tool.UsesRemaining < 1 )
    toolBroken = true;

   if ( toolBroken )
    tool.Delete();

   Item item = Activator.CreateInstance( ItemType ) as Item;

   if ( item != null )
   {
    if ( item is BaseWeapon )
    {
     BaseWeapon weapon = ( BaseWeapon )item;

     if ( makersMark )
      weapon.Crafter = from;

     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 );

     }
     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;

     if ( makersMark )
      armor.Crafter = from;

     Type resourceType = typeRes;

     if ( resourceType == null )
      resourceType = Ressources.GetAt( 0 ).ItemType;

     armor.Resource = CraftResources.GetFromType( resourceType );
     armor.PlayerConstructed = true;

     CraftContext context = craftSystem.GetContext( from );

     if ( context != null && context.DoNotColor )
      armor.Hue = 0;

     if ( Core.AOS && tool is BaseRunicTool )
      ((BaseRunicTool)tool).ApplyAttributesTo( armor );
    }
    else if ( item is DragonBardingDeed )
    {
     DragonBardingDeed deed = (DragonBardingDeed)item;

     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;

     if ( makersMark )
      instrument.Crafter = from;
    }
    else if ( item is BaseJewel )
    {
     BaseJewel jewel = (BaseJewel)item;

     Type resourceType = typeRes;

     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;
     }
    }
    else if ( item is BaseClothing )
    {
     BaseClothing clothing = (BaseClothing)item;

     if ( makersMark )
      clothing.Crafter = from;

     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
     {
      clothing.Hue = resHue;
     }
    }
    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;
     }
     else
     {
      from.SendLocalizedMessage( 500637 ); // Your tinker skill was insufficient to make the item lockable.
     }
    }
    else if ( item is Runebook )
    {
     int charges = 5 + (int)(from.Skills[SkillName.Inscribe].Value / 30);

     if ( charges > 10 )
      charges = 10;

     ((Runebook)item).MaxCharges = charges;
    }
    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();

       break;
      }
     }
    }

    from.AddToBackpack( item );

    //from.PlaySound( 0x57 );
   }

   int num = craftSystem.PlayEndingEffect( from, false, true, toolBroken, 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 ) )
   {
    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, 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 );
  }
 }

 private class InternalTimer : Timer
 {
  private Mobile m_From;
  private int m_iCount;
  private int m_iCountMax;
  private CraftItem m_CraftItem;
  private CraftSystem m_CraftSystem;
  private Type m_TypeRes;
  private BaseTool m_Tool;

  public InternalTimer( Mobile from, CraftSystem craftSystem, CraftItem craftItem, Type typeRes, BaseTool tool, int iCountMax ) : base( TimeSpan.Zero, TimeSpan.FromSeconds( craftSystem.Delay ), iCountMax )
  {
   m_From = from;
   m_CraftItem = craftItem;
   m_iCount = 0;
   m_iCountMax = iCountMax;
   m_CraftSystem = craftSystem;
   m_TypeRes = typeRes;
   m_Tool = tool;
  }

  private static Type[] m_MarkableTypes = new Type[]
   {
    typeof( BaseArmor ),
    typeof( BaseWeapon ),
    typeof( BaseClothing ),
    typeof( DragonBardingDeed )
   };

  protected override void OnTick()
  {
   m_iCount++;

   m_From.DisruptiveAction();

   if ( m_iCount < m_iCountMax )
   {
    m_CraftSystem.PlayCraftEffect( m_From );
   }
   else
   {
    m_From.EndAction( typeof( CraftSystem ) );

    int badCraft = m_CraftSystem.CanCraft( m_From, m_Tool, m_CraftItem.m_Type );

    if ( badCraft > 0 )
    {
     if ( m_Tool != null && !m_Tool.Deleted && m_Tool.UsesRemaining > 0 )
      m_From.SendGump( new CraftGump( m_From, m_CraftSystem, m_Tool, badCraft ) );
     else
      m_From.SendLocalizedMessage( badCraft );

     return;
    }

    bool allRequiredSkills = true;

    m_CraftItem.CheckSkills( m_From, m_TypeRes, m_CraftSystem, ref allRequiredSkills, false );

    CraftContext context = m_CraftSystem.GetContext( m_From );

    if ( context == null )
     return;

    bool makersMark = false;

    if ( makersMark && context.MarkOption == CraftMarkOption.PromptForMark )
    {
     m_From.SendGump( new QueryMakersMarkGump( m_From, m_CraftItem, m_CraftSystem, m_TypeRes, m_Tool ) );
    }
    else
    {
     if ( context.MarkOption == CraftMarkOption.DoNotMark )
      makersMark = false;

     m_CraftItem.CompleteCraft( makersMark, m_From, m_CraftSystem, m_TypeRes, m_Tool );
    }
   }
  }
 }
}
}

Belladonne - September 15, 2004 08:33 AM (GMT)
je sais pas je dois etre un peu fatiguée ce matin mais ... je comprends pas ca marche ou ca marche pas finalement ?

Lokscander - September 15, 2004 01:57 PM (GMT)
j'ai toujours l'erreure.... donc ca marche pas.

Ci haut j'ai expliqué comment j'ai fait... c'est la bonne procédure ?

slade15 - September 15, 2004 03:09 PM (GMT)
voila en a fini par trouver , c'etais un erreur de frappe

public class CraftItem au lieu de public class CraftItem7

Lokscander - September 15, 2004 05:08 PM (GMT)
Choutte j'viens de trouver comment faire ! Tout fonctionne à merveille présentement ! :D (J'avais juste à changer la formule de getExceptionnal chance pour qu'elle égale toujours 0... lol)

Didi - September 15, 2004 08:21 PM (GMT)
QUOTE (Lokscander @ Sep 15 2004, 06:08 PM)
Choutte j'viens de trouver comment faire ! Tout fonctionne à merveille présentement ! :D (J'avais juste à changer la formule de getExceptionnal chance pour qu'elle égale toujours 0... lol)

et le PoorQuality aussi je présume (basse qualité)

Lokscander - September 15, 2004 11:08 PM (GMT)
Étrangement j'en ai jamais des poor quality et j'ai pas trouvé la formule pour le calculer... ca doit pu exister. ^^

Zenryl - September 16, 2004 06:50 PM (GMT)
C'est pas supprimé avec AoS?

Lokscander - September 16, 2004 09:37 PM (GMT)
Bah je sais pas, mais en détruisant l'action GetExceptionnal, les poor quality et les exceptionnals quality n'existent plus sous Run UO. ^^




Hosted for free by InvisionFree