hi Zarox
try this, maybe you like it :
Code:
#================================ 
# CRAFTING PROGRAM 
#---------------------------------------------------------------- 
#-written by Deke 
#-yes_no window code created by Phsylomortis 
#---------------------------------------------------------------- 
#================================ 
#updates to Game_Party class 
class Game_Party 
  
 attr_accessor       :recipes 
  
 alias crafting_party_initialize initialize 
  
 def initialize 
   crafting_party_initialize 
   @recipes=[] 
 end 
  
 #---------------------------------------------------------------------- 
 def know?(recipe, version = 1) 
   unless recipe.is_a?(Game_Recipe) 
     recipe = get_recipe_from_master_list(recipe, version) 
   end 
   return $game_party.recipes.include?(recipe) 
 end 
  
#---------------------------------------------------------------------- 
 def learn_recipe(recipe , version = 1) 
   unless recipe.is_a?(Game_Recipe) 
     recipe = get_recipe_from_master_list(recipe, version) 
   end 
   if recipe.is_a?(Game_Recipe) 
     unless know?(recipe) 
       @recipes.push(recipe) 
     end 
   end 
 end 
  
#---------------------------------------------------------------------- 
 def forget_recipe(recipe , version = 1) 
   if !recipe.is_a?(Game_Recipe) 
     recipe = get_recipe_from_master_list(recipe, version) 
   end 
   if recipe.is_a?(Game_Recipe) 
     for i in 0...@recipes.size 
       if recipe == @recipes[i] 
         index = i 
         break 
       end 
     end 
     if index != nil 
       @recipes.delete(@recipes[index]) 
     end 
   end 
 end 
  
#---------------------------------------------------------------------- 
 def get_recipe_from_master_list(item, version) 
   index = nil 
   for i in 0...$game_temp.recipe_list.size 
     if item[0] == $game_temp.recipe_list[i].result and item[1] ==$game_temp.recipe_list[i].result_type 
       version -= 1 
       if version == 0 
         index = i 
         break 
       end 
     end 
   end 
   if index.is_a?(Integer) 
     return ($game_temp.recipe_list[index]) 
   else 
     return false 
   end 
 end 
  
end # of Game_Party updates 
#================================ 
class Game_Recipe 
 attr_reader :ingredients 
 attr_reader :quantities 
 attr_reader :result 
 attr_reader :result_type 
 attr_reader :ingredient_types 
  
#---------------------------------------------------------------------- 
 def initialize( ingredients, ingredient_types, quantities, result, result_type) 
   @ingredients = ingredients 
   @ingredient_types = ingredient_types 
   @quantities = quantities 
   @result = result 
   @result_type = result_type 
 end 
  
#---------------------------------------------------------------------- 
 def name 
   case @result_type 
     when 0 
       name = $data_items[@result].name 
     when 1 
       name = $data_armors[@result].name 
     when 2 
       name = $data_weapons[@result].name 
   end 
   return name 
 end 
#---------------------------------------------------------------------- 
 def have 
   have_all = true 
   for i in 0...@ingredients.size 
     case @ingredient_types[i] 
       when 0 
         if $game_party.item_number(@ingredients[i]) < @quantities[i] 
           have_all=false 
         end 
       when 1 
         if $game_party.armor_number(@ingredients[i]) < @quantities[i] 
           have_all=false 
         end 
       when 2 
         if $game_party.weapon_number(@ingredients[i]) < @quantities[i] 
           have_all=false 
         end 
     end 
   end 
   return have_all 
 end 
#---------------------------------------------------------------------- 
 def decrement 
   for i in 0...@ingredients.size 
     case @ingredient_types[i] 
     when 0 
       $game_party.lose_item(@ingredients[i], @quantities[i]) 
     when 1 
       $game_party.lose_armor(@ingredients[i], @quantities[i]) 
     when 2 
       $game_party.lose_weapon(@ingredients[i], @quantities[i]) 
     end 
   end 
 end 
#---------------------------------------------------------------------- 
 def make 
   if have 
     case @result_type 
     when 0 
       $game_party.gain_item(@result, 1) 
     when 1 
       $game_party.gain_armor(@result, 1) 
     when 2 
       $game_party.gain_weapon(@result, 1) 
     end 
     decrement 
   end 
 end 
  
#---------------------------------------------------------------------- 
 def == (recipe) 
   if recipe.is_a?(Game_Recipe) 
     equal = true 
     if recipe.ingredients != self.ingredients 
       equal = false 
     end 
     if recipe.ingredient_types != self.ingredient_types 
       equal = false 
     end 
     if recipe.quantities != self.quantities 
       equal = false 
     end 
     if recipe.result != self.result 
       equal=false 
     end 
     if recipe.result_type != self.result_type 
       equal = false 
     end 
   else 
     equal = false 
   end 
   return equal 
 end 
  
end # of Game_Recipe class 
#=================================== 
class Window_Craft < Window_Selectable 
 #-------------------------------------------------------------------------- 
 def initialize 
   super(0, 64, 240, 416) 
   @column_max = 1 
   refresh 
   self.index = 0 
 end 
 #-------------------------------------------------------------------------- 
 def recipe 
   return @data[self.index] 
 end 
 #-------------------------------------------------------------------------- 
 def refresh 
   if self.contents != nil 
     self.contents.dispose 
     self.contents = nil 
   end 
   @data = [] 
   for i in 0...$game_party.recipes.size 
       @data.push($game_party.recipes[i]) 
   end 
   @item_max = @data.size 
   if @item_max > 0 
     self.contents = Bitmap.new(width - 32, row_max * 32) 
     self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype 
     self.contents.font.size = $fontsize.is_a?(Integer) ? $fontsize : $defaultfontsize 
     for i in 0...@item_max 
       draw_item(i) 
     end 
   end 
 end 
 #-------------------------------------------------------------------------- 
 def draw_item(index) 
   recipe = @data[index] 
   self.contents.font.color = recipe.have ? normal_color : disabled_color 
   x = 16 
   y = index * 32 
   self.contents.draw_text(x , y, self.width-32, 32, recipe.name, 0) 
 end 
 #-------------------------------------------------------------------------- 
 def update_help 
   current_recipe = recipe 
   if current_recipe.is_a?(Game_Recipe) 
   case current_recipe.result_type 
     when 0 
       description = $data_items[current_recipe.result].description 
     when 1 
       description = $data_armors[current_recipe.result].description 
     when 2 
       description = $data_weapons[current_recipe.result].description 
     end 
   else 
     description = "" 
   end 
   @help_window.set_text(description) 
   @help_window.update 
 end 
  
end # of Window_Craft 
#======================================= 
class Window_CraftResult < Window_Base 
 #-------------------------------------------------------------------------- 
 def initialize 
   super(240, 64, 400, 184) 
   self.contents = Bitmap.new(width - 32, height - 32) 
   self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype 
   self.contents.font.size = 20 
   @result = nil 
   @type = nil 
 end 
 #-------------------------------------------------------------------------- 
 def refresh 
   self.contents.clear 
   case @type 
     when 0 
       item = $data_items[@result] 
       if item.recover_hp_rate > item.recover_hp 
         hp_string = "HP Recovery% :" 
         hp_stat = item.recover_hp_rate 
       else 
         hp_string = "HP Recovery Points:" 
         hp_stat = item.recover_hp 
       end 
       if item.recover_sp_rate > item.recover_sp 
         sp_string = "SP Recovery% :" 
         sp_stat = item.recover_sp_rate 
       else 
         sp_string = "SP Recovery Points:" 
         sp_stat = item.recover_sp 
       end 
       @strings = [hp_string, sp_string, "Phy. Def :" , "Mag. Def:", "Accuracy:", "Variance:"] 
       @stats = [hp_stat, sp_stat, item. pdef_f, item.mdef_f, item.hit, item.variance, 
                      $game_party.item_number(@result)] 
       @bitmap = RPG::Cache.icon(item.icon_name) 
     when 1 
       item = $data_armors[@result] 
       @strings = ["PDF:", "MDF:", "EVA:", "FOR:", "DEX :", "VIT :", "ESP :"] 
       @stats = [item.pdef, item.mdef, item.eva, item.str_plus, item.dex_plus, 
                   item.agi_plus, item.int_plus, $game_party.armor_number(@result) ] 
       @bitmap = RPG::Cache.icon(item.icon_name) 
     when 2 
       item = $data_weapons[@result] 
       @strings =["ATK :", "PDF:", "MDF:", "FOR :", "DEX :", 
                   "VIT :", "ESP :"] 
 
       @stats = [item.atk, item.pdef, item.mdef, item.str_plus, item.dex_plus, 
                   item.agi_plus, item.int_plus, $game_party.weapon_number(@result) ] 
       @bitmap = RPG::Cache.icon(item.icon_name) 
   end 
   for i in 0...@strings.size 
     x = i%2 * 184 
     y = i /2 *28 +32 
     self.contents.font.color = normal_color 
     self.contents.draw_text(x,y,100, 28,@strings[i]) 
     self.contents.font.color = system_color 
     self.contents.draw_text(x + 110, y, 45, 28, @stats[i].to_s) 
   end 
   self.contents.blt(0, 0, @bitmap, Rect.new(0, 0, 24, 24), 255) 
   self.contents.font.color= normal_color 
   self.contents.draw_text(40, 0, 300, 28, "Stats :") 
   self.contents.font.color = system_color 
   count = @stats[@stats.size - 1].to_s 
   self.contents.draw_text(294, 0, 45, 28, count ) 
 end 
    
#---------------------------------------------------------------------- 
 def set_result(result , type) 
   @result = result 
   @type = type 
   refresh 
 end 
end #of Window_CraftResult 
#======================================= 
class Window_CraftIngredients < Window_Base 
 #-------------------------------------------------------------------------- 
 def initialize 
   super(240, 248, 400, 232) 
   self.contents = Bitmap.new(width - 32, height - 32) 
   self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype 
   self.contents.font.size = 20 
   @ingredients = [] 
   @types = [] 
   @quantities = [] 
   @item = nil 
   @count = 0 
 end 
 #-------------------------------------------------------------------------- 
 def refresh 
   self.contents.clear 
   for i in 0...@ingredients.size 
     case @types[i] 
     when 0 
       @item = $data_items[@ingredients[i]] 
       @count = $game_party.item_number(@ingredients[i]) 
     when 1 
       @item = $data_armors[@ingredients[i]] 
       @count = $game_party.armor_number(@ingredients[i]) 
     when 2 
       @item = $data_weapons[@ingredients[i]] 
       @count = $game_party.weapon_number(@ingredients[i]) 
     end 
     y = i *26 
     self.contents.blt(0, y, RPG::Cache.icon(@item.icon_name), Rect.new(0, 0, 24, 24), 255) 
     self.contents.font.color = @count >= @quantities[i] ? normal_color : disabled_color 
     self.contents.draw_text(30, y, 280, 28, @item.name) 
     self.contents.draw_text(300, y, 45, 28, @quantities[i].to_s) 
     self.contents.font.color = system_color 
     self.contents.draw_text(245, y, 45, 28, @count.to_s )      
   end 
 end 
      
 #-------------------------------------------------------------------------- 
 def set_ingredients(ingredients , types, quantities) 
   @ingredients = ingredients 
   @types = types 
   @quantities = quantities 
   refresh 
 end 
end # of Window_CraftIngredients 
#====================================== 
class Scene_Craft 
 #-------------------------------------------------------------------------- 
 def initialize(craft_index=0, return_scene = "menu") 
   @craft_index=craft_index 
   @return_scene = return_scene 
 end 
  
 #-------------------------------------------------------------------------- 
 def main 
   @craft_window = Window_Craft.new 
   @craft_window.index=@craft_index 
   @confirm_window = Window_Base.new(120, 188, 400, 64) 
   @confirm_window.contents = Bitmap.new(368, 32) 
   @confirm_window.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype 
   @confirm_window.contents.font.size = $fontsize.is_a?(Integer) ? $fontsize : $defaultfontsize 
   @help_window = Window_Help.new 
   @craft_window.help_window = @help_window 
   @result_window=Window_CraftResult.new 
   @ingredients_window=Window_CraftIngredients.new 
   @yes_no_window = Window_Command.new(100, ["Oui", "Non"]) 
   @confirm_window.visible = false 
   @confirm_window.z = 1500 
   @yes_no_window.visible = false 
   @yes_no_window.active = false 
   @yes_no_window.index = 1 
   @yes_no_window.x = 270 
   @yes_no_window.y = 252 
   @yes_no_window.z = 1500 
   @label_window = Window_Base.new(450,200,190,52) 
   @label_window.contents=Bitmap.new(@label_window.width - 32,@label_window.height - 32) 
   @label_window.contents.font.size=20 
   @label_window.contents.font.color = @label_window.normal_color 
   @label_window.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype 
   @label_window.contents.draw_text(0, 0, @label_window.contents.width, 20, "   En possession    Nécéssaire") 
   Graphics.transition 
   loop do 
     Graphics.update 
     Input.update 
     update 
     if $scene != self 
       break 
     end 
   end 
   Graphics.freeze 
   @help_window.dispose 
   @craft_window.dispose 
   @result_window.dispose 
   @ingredients_window.dispose 
   @confirm_window.dispose 
   @yes_no_window.dispose 
   @label_window.dispose 
 end 
 #-------------------------------------------------------------------------- 
 def update 
   @craft_window.update 
   @ingredients_window.update 
   if $game_party.recipes.size > 0 
     @result_window.set_result(@craft_window.recipe.result, @craft_window.recipe.result_type) 
     @ingredients_window.set_ingredients(@craft_window.recipe.ingredients, 
                                                          @craft_window.recipe.ingredient_types, 
                                                          @craft_window.recipe.quantities) 
   end 
   if @craft_window.active 
     update_craft 
     return 
   end 
   if @yes_no_window.active 
     confirm_update 
     return 
   end 
 end 
 #-------------------------------------------------------------------------- 
 def update_craft 
   if Input.trigger?(Input::B) 
     $game_system.se_play($data_system.cancel_se) 
     if @return_scene == "menu" 
       $scene = Scene_Menu.new(0) 
     else 
       $scene = Scene_Map.new 
     end 
     return 
   end 
   if Input.trigger?(Input::C) 
     @recipe = @craft_window.recipe 
     if @recipe.have 
       @yes_no_window.active = true 
       @craft_window.active = false 
     else 
       $game_system.se_play($data_system.buzzer_se) 
       return 
     end 
   end 
 end 
 #-------------------------------------------------------------------------- 
 def confirm_update 
   @craft_index = @craft_window.index 
   @confirm_window.visible = true 
   @confirm_window.z = 1500 
   @yes_no_window.visible = true 
   @yes_no_window.active = true 
   @yes_no_window.z = 1500 
   @yes_no_window.update 
   string = "Craft Weapon  " + @recipe.name + "?" 
   cw = @confirm_window.contents.text_size(string).width 
   center = @confirm_window.contents.width/2 - cw /2 
   unless @drawn 
     @confirm_window.contents.draw_text(center, 0, cw, 30, string) 
     @drawn = true 
   end 
   if Input.trigger?(Input::C) 
     if @yes_no_window.index == 0 
       $game_system.se_play($data_system.decision_se) 
       @recipe.make 
       $game_system.se_play($data_system.save_se) 
       $scene=Scene_Craft.new(@craft_index) 
     else 
       $game_system.se_play($data_system.cancel_se) 
       $scene=Scene_Craft.new(@craft_index) 
     end 
   end 
   if Input.trigger?(Input::B) 
     $game_system.se_play($data_system.cancel_se) 
     $scene=Scene_Craft.new(@craft_index) 
   end 
 end 
 
ingredients = [30,31,32] 
types = [0,0,0] 
quantities = [1,1,1] 
sword=Game_Recipe.new(ingredients, types, quantities,4,2)
end # of Scene_Craft
This script allows weapons creation by crafting system.
Events : this is working via script call.Edit the script and call the recipies.
How it works : 
Make a new scrip above main and call it Crafting System or no matter what.
1.INGREDIENTS 
A :
Item to be used to make the desired item.
This is just corresponding to the index of items in the data base.
For example, the Item with ID no. 30 is the Lithograph, ID of Card and Fruit are 31 and 32
If we want to make a recipe using those 3 items to make one, this is gona be written like that : 
[30,31,32] 
B :
When you want the recipes to not be made only with items but with armors or weapons too,
Specify the type of item with a number :
-Items = 0 
-Armors = 1 
-Weapons = 2 
In this case the items recepe will be written like that  [0,0,0] 
C :
When you know the ID and type of items required, then letâs specify the required quantity of each item. 
If we want an item of same type, then the spelling is like that : [1,1,1] 
2. THE RESULT
A:
As for ingredients you have to specify the type of the item that will  be created, and its ID.
For example, if you wana make a Mithril Sword, its ID will be 4 in the Data Base. 
B:
Like before with ingredients, specify the item type (0 for items, 
1 for armors and 2 for weapons) 
So, if you need 1 Lithograph + 1 Card + 1 Fruit to make a Mithril Sword, use this code : 
ingredients = [30,31,32] 
types = [0,0,0] 
quantities = [1,1,1] 
sword=Game_Recipe.new(ingredients, types, quantities,4,2) 
 
Now that your new recipie has been created, the party has to learn it, so use this code :
$game_party.learn_recipe(sword)  
Finally to launch the Blacksmith screen use this code :
$scene=Scene_Craft.new 
2.RECIPIES 
When you want your party to learn other recipies youâve created use this kind of codes :
Code: 
  
$game_party.learn_recipe([4,2]) 
$game_party.learn_recipe([8,1]) 
$game_party.learn_recipe([4,0])  
The first one will make your party learn the receipie to create a Mithril Sword (4 is the ID of the Mithril Sword and 2 means Weapon)
The second one is for the 8th armor 
The third one will be for the 4th item.