[Script] [ACE] Crafting_Table?

gdarkness98gdarkness98 Posts: 13Registered
Lần đầu viết script và post nên có nhiều sơ xuất mong ae lượng thứ!  :rolleyes: 

   
[align=center][size=xx-large]Crafting Table[/size][/align]



[size=x-large]Chức năng, công dụng:[/size]
 
Tạo item không cần phải mua từ cửa hàng mà là từ những nguyên liệu bạn có!
Thích hợp trong mọi game nhất là game sinh tồn
  ;) 


[size=x-large]Hướng dẫn sử dụng:
[/size]
Đã có trong Script, các bạn chịu khó đọc.
Import ảnh "CraftTable.png" vào phần "Graphics/Pictures" trong "Resources Manager".
Đặt script trên main và dưới phần Materials.


[size=x-large]Script[/size]
#~ =============================
#~   Name  : Crafting_Table
#~   Author: TrNKjnG
#~   Ver   : 1.0
#~ =============================
#Setup_Module
module CRAFTTABLE
 DATA = [] # không nên đổi nó
 #THÊM MỚI:
 #DATA[ID] = [Loại craft, Item xuất, Item nguyên liệu 1, Item nguyên liệu 2,...]
 #Loại craft : 0 => Phải xếp item đúng trật tự;
 #1 => Xếp item lung tung; -> 
 #2 => Xếp item mọi vị trí nhưng vẫn phải giữ kết cấu -> Rìu trong minecraft
 #Item xuất: [i_Type, Id, Number]
 #Item nguyên liệu : [i_Type, Id, Pos]
 #i_type : 0 => item, 1 => vũ khí, 2=> giáp
 #Pos
 #| 0 | 1 | 2 |
 #| 3 | 4 | 5 |
 #| 6 | 7 | 8 |
 #Ví dụ: Bạn muốn làm Quốc gỗ là "vũ khí" có id là "1" vói số lượng "1" cái
 #Vói nguyên liệu là:
 #-3 cái que với type là "item" và id là "1" và pos lần lượt là: 0, 1, 2
 #-2 cái Gõ vói type là "item", id là "2" và pos là 4,7
 #Item nguyên liệu phải đặt đúng vị trí pos của nó thì mới ra item xuất
 #=> DATA[0] = [0, [1,1,1], [0,1,0], [0,1,1], [0,1,2], [0,2,4], [0,2,7] ]
 #Note: "Các loại craft là 2 thì item nguyên liệu đầu tiên luôn phải đặt ở pos 0"
 #Khi trong ô không có item: ấn "OK" để chon item, ấn "cancel" để hủy craft. 
 #Khi trong ô có item: ấn "OK" để tăng số lượng, ấn "Cancel" để giảm số lượng
 #Quoc go
 DATA[0] = [2, [1, 1, 1], [0, 18, 0], [0, 18, 1], [0, 18, 3], [0, 58, 4], [0, 58, 7]]
 
 #Riu go
 DATA[1] = [0, [1, 61, 1], [0, 18, 0], [0, 18, 1], [0, 18, 2], [0, 58, 4], [0, 58, 7]]
 
 #Gay
 DATA[2] = [1, [0, 58, 4], [0, 18, 0]]
 
 #thoi vang
 DATA[3] = [2, [0, 59, 1], [0, 23, 0], [0, 23, 1], [0, 23, 2], [0, 23, 3], [0, 23, 4], [0, 23, 5]] 
end

#Name_Box
class CraftTable_Name_Box < Window_Base
 def initialize(x, y, width)
   super(x, y, width, fitting_height(1))
 end

 def clear
   contents.clear
   @item = nil
 end
 
 def set_item(item)
   @item = item ? item : nil
   refresh
 end
 def refresh
   contents.clear
   if @item
     draw_item_name(@item, 0, 0)
   else
     draw_text_ex_cus(4, 0, "")
   end
 end
 
end
#Item_List

class CraftTable_Item_List < Window_Selectable
 def initialize(x, y, width, height)
   super
   @category = :none
   @data = []
 end
 
 def select(index)
   super
 end
 
 def category=(category)
   return if @category == category
   @category = category
   refresh
   self.oy = 0
 end
 
 def col_max
   return 2
 end
 
 def item_max
   @data ? @data.size : 1
 end
 
 def item
   @data && index >= 0 ? @data[index] : nil
 end
 
 def current_item_enabled?
   enable?(@data[index])
 end
 
 def include?(item)
   case @category
   when :item
     item.is_a?(RPG::Item) && !item.key_item?
   when :weapon
     item.is_a?(RPG::Weapon)
   when :armor
     item.is_a?(RPG::Armor)
   when :key_item
     item.is_a?(RPG::Item) && item.key_item?
   else
     false
   end
 end
 
 def enable?(item)
   return true
 end
 
 def make_item_list
   @data = $game_party.all_items.select {|item| include?(item) }
   @data.push(nil) if include?(nil)
 end
 
 def select_last
   select(@data.index($game_party.last_item.object) || 0)
 end
 
 def draw_item(index)
   item = @data[index]
   if item
     rect = item_rect(index)
     rect.width -= 4
     draw_item_name(item, rect.x, rect.y)
     draw_item_number(rect, item)
   end
 end
 
 def draw_item_number(rect, item)
   draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
 end

 def nb_window=(nb_window)
   @nb_window = nb_window
 end
 
 def update_help
   @help_window.clear
   @help_window.set_item(item)
   @nb_window.clear
   @nb_window.set_item(item)
 end

 def refresh
   make_item_list
   create_contents
   draw_all_items
 end
end


#Window_Command
class CraftTable_Cmd < Window_HorzCommand

 def initialize(x, y,window_width)
   @window_width = window_width
   super(x, y)
 end

 def window_width
   @window_width
 end

 def col_max
   return 3
 end

 def make_command_list
   add_command("Items",    :item)
   add_command("Weapons",   :weapon)
   add_command("Armors", :armor)
 end
end


#Window_help

class CraftTable_Help < Window_Base

 def initialize(x, y, width, line_number = 2)
   super(x, y, width, fitting_height(line_number))
 end

 def set_text(text)
   if text != @text
     @text = text
     refresh
   end
 end

 def clear
   set_text("")
 end

 def set_item(item)
   set_text(item ? item.description : "")
 end
 def refresh
   contents.clear
   draw_text_ex_cus(4, 0, @text, 18)
 end
end


# Create_Table
class Crafting_Table < Window_Base
 attr_reader   :index                    # cursor position
 attr_reader   :help_window
 attr_reader   :nb_window
 attr_accessor :cursor_fix               # fix cursor flag
 attr_accessor :cursor_all               # select all cursors flag
 def initialize(x, y)
   super(x,y,200, 390)
   @index = -1
   @handler = {}
   @cursor_fix = false
   @cursor_all = false
   select(0)
   config
 end

 def config
   self.opacity = 0
   @bg = Sprite.new
   @bg.bitmap = Cache.picture("CraftTable")
   @bg.x = self.x
   @bg.y = self.y
   @bitmap = Cache.system("Iconset")
   setup_data_base
 end
 
 def setup_data_base
   @box = []
   @box_num = []
   @box_item = []
   @box_pos = []
   @box_fake = []
   for i in 0..9
     @box_num[i] = 0
     @box_item[i] = nil
   end
   
 end
 
 def get_item_bitmap(item)
   if item
     icon_index = item.icon_index
     s = Sprite.new
     s.bitmap = @bitmap
     s.src_rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
   else
     s = nil
   end
   s
 end
 
 
#===============================================================================
 def add_item_num(index, num)
   free_box(9)
   @box_num[index] += num if @box_num[index] != 0
   if number(index) <= 0
     free_box(index)
   end
   check_recipe if index != 9
   refresh
 end
 
 def free_box(index)
   @box[index].dispose if @box[index]
   @box_item[index] = nil
   @box_num[index] = 0
 end
 
 
 def number(index)
   return @box_num[index]
 end
 
 def item(index)
   return @box_item[index]
 end
 
 def box_set_item(index, item)
   if @box[index]
     free_box(index)
   end
   if item
     @box[index] = get_item_bitmap(item)
     @box[index].ox = 0
     @box[index].oy = 0
     @box_item[index] = item
     @box_num[index] = 1
     set_box_x_y(index)
     check_recipe if index != 9
   end
   refresh
 end
 
 def call_cancel
   for i in 0..8
     if item(i) && number(i) > 0
       $game_party.gain_item(item(i), number(i))
     end
   end
 end
 
 def call_ok
   time = min_num
   if $game_party.item_max?(item(9))
     Sound.play_buzzer
   else
     Audio.se_play("Audio/SE/Hammer Clang.wav")
     $game_party.gain_item(item(9), number(9)*time)
     for i in 0..8
       if item(i) && number(i) > 0
         add_item_num(i, (-1)*time)
       end
     end
     check_recipe
   end
 end
 
#================================================================================
 def min_num
   num = []
   min = 0
   for i in 0..8
     if item(i) && number(i) > 0
       num.push(@box_num[i]) if @box_num[i] != 0
     end
   end
   if num != []
     min = num[0]
     for i in 1...num.size
       min = [min, num[i]].min
     end
   end
   return min
 end
 
 def set_font
   contents.font.size = 30
 end
 
 def text_rect(index)
   rect = Rect.new
   if index <= 8
     rect.width = 48
     rect.height = 48
     rect.x = index % 3 * (48 + spacing_x) + origin_x
     rect.y = index / 3 * (48 + spacing_y) + origin_y + 12
   else
     rect.width = 72
     rect.height = 72
     rect.x = 49
     rect.y = 298 + 18
   end
   rect
 end
 
 def draw_number
   set_font
   for i in 0..9
     if i <= 8
       if @box_num[i] > 0
         num = sprintf("%d", @box_num[i])
         draw_text(text_rect(i), num, 2)
       end
     else
       if @box_num[i] > 0 && min_num > 0
         num = sprintf("%d", @box_num[i]*min_num)
         draw_text(text_rect(i), num, 2) 
       end
     end
   end
 end
 
 def get_item_by_attr(obj)
   id = obj[1]
   case obj[0]
   when 0
     return $data_items[id]
   when 1
     return $data_weapons[id]
   when 2
     return $data_armors[id]
   end
 end
 
 def nomore_item?(obj, check = false)
   nomore = true
   allpos = [0,1,2,3,4,5,6,7,8]
   start = 2
   start = 0 if check
   pos =  []
   space = []
   check_obj = obj
   check_obj = @box_fake if check
   for i in start...check_obj.size
     pos.push(check_obj[i][2])
   end
   space = allpos - pos
   for i in 0...space.size
     if number(space[i]) > 0
       nomore = false
     end
   end
   return nomore
 end
 
 def check_recipe_0?(obj)
   kq =  true
   for i in 2...obj.size
     if get_item_by_attr(obj[i]) !=  @box_item[obj[i][2]]
      kq = false
     end
   end
   return kq
 end
 
 def check_recipe_1?(obj)
   kq = true
   @box_pos.clear
   @box_fake.clear
   for i in 0..8
     if number(i) > 0
       @box_pos.push(i)
     end
   end
   for i in 2...obj.size
     @box_fake.push(get_item_by_attr(obj[i]))
   end
   
   if @box_pos != []
   
     if @box_fake.size != @box_pos.size
       return false
     else
       for i in 0...@box_pos.size
         for j in 0...@box_fake.size
           if i == @box_pos.size - 1
             kq = false if @box_item[@box_pos[i]] != @box_fake[j]
           else
             if @box_item[@box_pos[i]] == @box_fake[j]
               @box_fake.delete_at(j)
               break
             end
           end
         end
       end
     end
   else
     return false
   end
   
   
   return kq
 end
 
 def check_recipe_2?(obj)
   kq =  true
   @box_pos.clear
   @box_fake.clear
   box_pos_0 = []
   for i in 0..8
     if number(i) > 0
       @box_pos.push(i)
       box_pos_0.push(i)
     end
   end
   if box_pos_0 != []
     delta = box_pos_0[0] - obj[2][2]
     for i in 2...obj.size
       @box_fake.push([obj[i][0], obj[i][1], delta+obj[i][2]])
     end
     for i in 0...@box_fake.size
       if get_item_by_attr(@box_fake[i]) !=  @box_item[@box_fake[i][2]]
       kq = false
       end
     end
   else
     kq = false
   end
   return kq
 end
 
 def check_recipe
   free_box(9)
   CRAFTTABLE::DATA.each do |recipe|
     case recipe[0]
     when 0
       replace_item(get_item_by_attr(recipe[1]),
       recipe[1][2]) if check_recipe_0?(recipe) && nomore_item?(recipe)
     when 1
       replace_item(get_item_by_attr(recipe[1]),
       recipe[1][2]) if check_recipe_1?(recipe)# && nomore_item?(recipe, true)
     when 2
       replace_item(get_item_by_attr(recipe[1]),
       recipe[1][2]) if check_recipe_2?(recipe) && nomore_item?(recipe, true)
     end
   end
 end
 
 def replace_item(item, number)
   box_set_item(9, item)
   @box_num[9] = number
   refresh
 end
 
 def set_box_x_y(index)
   if index <= 8
     @box[index].zoom_x = 2
     @box[index].zoom_y = 2
     @box[index].x = index % 3 * (48 + spacing_x) + origin_x + 22
     @box[index].y = index / 3 * (48 + spacing_y) + origin_y + 22
   else
     @box[index].zoom_x = 3
     @box[index].zoom_y = 3
     @box[index].x = 49 + 22
     @box[index].y = 298 + 22
   end
 end
 
 def origin_x
   return 7
 end
 
 def origin_y
   return 28
 end

 def spacing_x
   return 6
 end
 
 def spacing_y
   return 6
 end

 def active=(active)
   super
   update_cursor
 end

 def index=(index)
   @index = index
   update_cursor
 end

 def select(index)
   self.index = index if index
 end

 def unselect
   self.index = -1
 end

 def item_rect(index)
   rect = Rect.new
   if index <= 8
     rect.width = 48
     rect.height = 48
     rect.x = index % 3 * (48 + spacing_x) + origin_x
     rect.y = index / 3 * (48 + spacing_y) + origin_y
   else
     rect.width = 72
     rect.height = 72
     rect.x = 49
     rect.y = 298
   end
   rect
 end
 def help_window=(help_window)
   @help_window = help_window
   call_update_help
 end
 
 def nb_window=(nb_window)
   @nb_window = nb_window
   call_update_help
 end

 def set_handler(symbol, method)
   @handler[symbol] = method
 end

 def handle?(symbol)
   @handler.include?(symbol)
 end

 def call_handler(symbol)
   @handler[symbol].call if handle?(symbol)
 end

 def cursor_movable?
   active && open? && !@cursor_fix && !@cursor_all
 end

 def cursor_down(wrap = false)
   if index < 10 - 3 || (wrap && 3 == 1)
     select((index + 3) % 10)
   elsif index == 7 || index == 8
     select(9)
   end
 end

 def cursor_up(wrap = false)
   if index >= 3 || (wrap && 3 == 1)
     select((index - 3 + 10) % 10)
   end
 end

 def cursor_right(wrap = false)
   if 3 >= 2 && (index < 10 - 1 || (wrap && false))
     select((index + 1) % 10)
   end
 end

 def cursor_left(wrap = false)
   if 3 >= 2 && (index > 0 || (wrap && false))
     select((index - 1 + 10) % 10)
   end
 end
 def update
   super
   process_cursor_move
   process_handling
 end

 def process_cursor_move
   return unless cursor_movable?
   last_index = @index
   cursor_down (Input.trigger?(:DOWN))  if Input.repeat?(:DOWN)
   cursor_up   (Input.trigger?(:UP))    if Input.repeat?(:UP)
   cursor_right(Input.trigger?(:RIGHT)) if Input.repeat?(:RIGHT)
   cursor_left (Input.trigger?(:LEFT))  if Input.repeat?(:LEFT)
   Sound.play_cursor if @index != last_index
   call_update_help
 end

 def process_handling
   return unless open? && active
   return process_ok       if ok_enabled?        && Input.trigger?(:C)
   return process_cancel   if cancel_enabled?    && Input.trigger?(:B)
 end

 def ok_enabled?
   handle?(:ok)
 end

 def cancel_enabled?
   handle?(:cancel)
 end

 def process_ok
     Input.update
     call_ok_handler
 end

 def call_ok_handler
   call_handler(:ok)
 end

 def process_cancel
   Input.update
   call_cancel_handler
 end

 def call_cancel_handler
   call_handler(:cancel)
 end
 
 
 def update_cursor
   cursor_rect.set(item_rect(@index))
 end
   
   
 def call_update_help
   update_help if active && @help_window
 end

 def update_help
   @help_window.clear
   @help_window.set_item(@box_item[@index])
   @nb_window.clear
   @nb_window.set_item(@box_item[@index])
 end

 def refresh
   contents.clear
   draw_number
 end

 def dispose
   for i in 0..9
     @box[i].bitmap.dispose if @box[i]
     @box[i].dispose if @box[i]
   end
   @bg.bitmap.dispose
   @bg.dispose
   super
 end
end

class Scene_Craft_Table < Scene_MenuBase
 def start
   super
   create_all_windows
 end
 
 def create_all_windows
   create_table
   create_name_box
   create_help
   create_item_cmd
   create_item_list
 end
 
 def create_item_cmd
   @cmd_win = CraftTable_Cmd.new(@help_win.x, @help_win.y+@help_win.height, @help_win.width)
   @cmd_win.hide.deactivate
   @cmd_win.set_handler(:item, method(:cmd_item_ok))
   @cmd_win.set_handler(:weapon, method(:cmd_weapon_ok))
   @cmd_win.set_handler(:armor, method(:cmd_armor_ok))
   @cmd_win.set_handler(:cancel, method(:cmd_cancel))
 end
 
 def create_item_list
   @item_list = CraftTable_Item_List.new(@cmd_win.x, @cmd_win.y+@cmd_win.height,
                                         @cmd_win.width,
                                         Graphics.height - @cmd_win.y-@cmd_win.height - 13)
   @item_list.hide.deactivate
   @item_list.help_window = @help_win
   @item_list.nb_window = @nb_win
   @item_list.set_handler(:ok, method(:item_ok))
   @item_list.set_handler(:cancel, method(:item_cancel))
 end
 
 def create_table
   @craft_table = Crafting_Table.new(10,10)
   @craft_table.show.activate
   @craft_table.set_handler(:ok, method(:tb_set_ok))
   @craft_table.set_handler(:cancel, method(:tb_set_cancel))
 end
 
 def create_help
   @help_win = CraftTable_Help.new(@nb_win.x, @nb_win.y+@nb_win.height, @nb_win.width)
   @craft_table.help_window = @help_win
 end
 
 def create_name_box
   @nb_win = CraftTable_Name_Box.new(@craft_table.x + @craft_table.width + 5,
                                   @craft_table.y,
                                   Graphics.width - @craft_table.x - @craft_table.width - 10)
   @craft_table.nb_window = @nb_win
 end
 
#===============================================================================
#~   def add_item_num(index, num)
#~   def free_box(index)
#~   def get_out_item_num
#~   def number(index)
#~   def item(index)
#~   def box_set_item(index, item)

 def tb_set_ok
   @index  = @craft_table.index
   item   = @craft_table.item(@index)
   number = @craft_table.number(@index)
   if @index <= 8
     if item
       if $game_party.has_item?(item)# have_item in bag?
         Sound.play_ok
         @craft_table.add_item_num(@index, 1)
         $game_party.gain_item(item, -1)
         @item_list.refresh
       else
         Sound.play_buzzer
       end
     else
       @craft_table.deactivate
       @cmd_win.show.activate
     end
   else
     if item # index = 9
       @craft_table.call_ok
     else
       Sound.play_buzzer
     end
   end
 end
 
 def cmd_item_ok
   @cmd_win.deactivate
   @item_list.show.activate
   @item_list.category= :item
   @item_list.select(0)
 end
 
 def cmd_weapon_ok
   @cmd_win.deactivate
   @item_list.show.activate
   @item_list.category= :weapon
   @item_list.select(0)
 end
 
 def cmd_armor_ok
   @cmd_win.deactivate
   @item_list.show.activate
   @item_list.category= :armor
   @item_list.select(0)
 end
 
 def cmd_cancel
   @cmd_win.select(0)
   @cmd_win.hide.deactivate
   @craft_table.activate
 end
 
 def item_ok
   item = @item_list.item
   $game_party.gain_item(item, -1)
   @cmd_win.hide
   @item_list.refresh
   @item_list.hide.deactivate
   @craft_table.box_set_item(@index, item)
   @craft_table.activate
 end
 
 def item_cancel
   @help_win.clear
   @nb_win.clear
   @item_list.hide.deactivate
   @cmd_win.show.activate
 end
 
 def tb_set_cancel
   @index  = @craft_table.index
   item   = @craft_table.item(@index)
   number = @craft_table.number(@index)
   if @index <= 8
     if item
       if !$game_party.item_max?(item)# have_item in bag?
         Sound.play_cancel
         $game_party.gain_item(item, +1)
         @craft_table.add_item_num(@index, -1)
         @item_list.refresh
       else
         Sound.play_buzzer
       end
     else
       Sound.play_cancel
       @craft_table.call_cancel
       return_scene
     end
   else
     Sound.play_cancel# index = 9
     @craft_table.call_cancel
     return_scene
   end
 end
#===============================================================================

 
 def update
   super
 end
 
end

[size=x-large]ScreenShots[/size]
1
2
3
4
5
6qfmhsW.png
afdl97w.png
6AbJXQW.png
h2BgGvy.png
nebhArU.png

[size=x-large]Credit[/size]Bạn nào sử dụng trong dự án thì xin Credit: TrnKjng hay Gdarkness đều được.

[size=x-large]Điều khoản sử dụng[/size]Có thể dùng trong mọi dự án nhưng xin Credit  :blush: 

[size=x-large]Demo & Resourge[/size]DEMO 1.0

[size=large]resourge[/size]
CrafTable
3uq1oxi.png

Comments

  • dsiver144dsiver144 Posts: 1,064Registered
    Lâu rồi mới thấy người viết script post lên. Cố gắng nhé bạn.
  • Dang_KhoaDang_Khoa Posts: 3,861Administrators
    Nice, lại xuất hiện thêm 1 coder mới rồi
    :D :D :D
  • BướmBướm Posts: 1,220Registered
    mấy cái chú thích nên viết tiếng a thì hay hơn, nhiều từ tiếng việt ko giải thích được hết hoặc ko có từ phù hợp lủng củng lắm, người ko biết code đọc thấy rất rối. tiện đây chế nên làm luôn 1 bộ script survive đi, cái này đang hot đấy
  • StupidDonutStupidDonut Posts: 1,196Registered
    Ngon :v 4rum lại có scripter, bạn ei, rảnh code giúp mình với nhé
  • gdarkness98gdarkness98 Posts: 13Registered
    Bướm wrote:
    mấy cái chú thích nên viết tiếng a thì hay hơn, nhiều từ tiếng việt ko giải thích được hết hoặc ko có từ phù hợp lủng củng lắm, người ko biết code đọc thấy rất rối. tiện đây chế nên làm luôn 1 bộ script survive đi, cái này đang hot đấy

    mình ngu tiếng anh :), để mình cố àm 1 bộ vậy!  :blush:
  • gdarkness98gdarkness98 Posts: 13Registered
    mr.rpg.700 wrote:
    Ngon :v 4rum lại có scripter, bạn ei, rảnh code giúp mình với nhé

    Sắp vô năm học mới rồi nên chắc không có thời gian rảnh đâu ạ! :s
  • OrinuOrinu Posts: 20Registered
    nice
    giống minecraft :D
  • TainguyTainguy Posts: 9Registered
    Link die...mục không đáp ứng điều lệ GG!
Sign In or Register to comment.