Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- #############################################################
- -- Turtle165 API
- -- Turtle API for ComputerCraft 1.65 or over
- -- required function: "turtle.getItemDetail()"
- -- (c) 2015 hevohevo, License: MIT
- -- twitter: @hevohevo, http://hevohevo.hatenablog.com/
- -- ##############################################################
- -- API List
- -- Turtle165.sortInventory()
- -- インベントリ内のアイテムを整理し並べ替える
- -- Turtle165.collectItem()
- -- インベントリ内のアイテムをまとめる
- -- Turtle165.getItemCountAll(item_name_str, [damage])
- -- インベントリ内のアイテム(名前・ダメージ値指定)の総数を返す
- -- Turtle165.selectItem(item_name_str, [damage])
- -- アイテム(名前・ダメージ値指定)があるスロットを選択する
- -- Turtle165.getEmptySlot()
- -- 空のスロット番号を返す
- -- Turtle165.selectEmptySlot()
- -- 空のスロットを選択する
- -- Turtle165.changeItems(slot0, slot1, tmp_slot)
- -- slot0とslot1のアイテムを入れ替える。なおtmp_slotは入れ替えるときの一時アイテム置き場。必須。
- -- ##############################################################
- -- インベントリ内にバラバラに入っているアイテムをできるだけまとめる
- -- turtle.transferTo(slot [, quantity]), 1/27作
- function collectItem()
- local selected_slot = turtle.getSelectedSlot()
- for i=1,16 do
- local detail = turtle.getItemDetail(i)
- if detail then -- スロットになにかアイテムある
- for j=i,16 do
- local detail2 = turtle.getItemDetail(j)
- if detail2 and detail["name"]==detail2["name"] and detail["damage"]==detail2["damage"] then
- turtle.select(j)
- turtle.transferTo(i)
- end
- end
- else -- スロットにアイテムない
- end
- end
- turtle.select(selected_slot)
- end
- -- turtle.getItemCounrt(slot_num) , 1/27作
- -- 発展→ getItemCountAll(item_name, damage) => アイテム総数
- function getItemCountAll(item_name, damage)
- local count = 0
- for i=1,16 do
- local detail = turtle.getItemDetail(i)
- if detail then -- スロットになにかアイテムある
- if string.match(detail["name"],item_name) then -- アイテム名がマッチする
- if damage == nil or damage==detail["damage"] then -- ダメージ値の指定があり、それが一致する
- count = count + detail["count"]
- end
- else -- アイテム名がマッチしない
- end
- else -- スロットにアイテムない
- end
- end
- return count
- end
- -- selectItem(name, damage) , 1/26作
- -- スロット内を探し、name(damage値指定があるときはそれも)とマッチするアイテムを選択する。
- function selectItem(name,damage)
- -- local selected_slot = turtle.getSelectedSlot()
- for i=1,16 do
- local item = turtle.getItemDetail(i)
- if type(item)=="table" then -- スロットに何かアイテム
- -- print("slot=",i," ",item["name"]," ",item["damage"])
- if string.match(item["name"],name) then -- 指定アイテムの名前と一致
- if damage==nil or damage == item["damage"] then -- ダメージ値指定がない、または指定と一致
- turtle.select(i)
- return true, item["count"]
- else -- 名前は一致したがダメージ値が違う
- -- do nothing
- end
- else -- 指定アイテムの名前と不一致
- -- do nothing
- end
- else -- スロット内にアイテムなし
- -- do nothing
- end
- end
- -- turtle.select(selected_slot)
- return false, "No item to match"
- end
- -- スロット番号の小さいほうから探し、空っぽのスロットを選択する。
- function selectEmptySlot()
- for i=1, 16 do
- local item = turtle.getItemDetail(i)
- if item == nil then
- turtle.select(i)
- return true
- end
- end
- return false
- end
- -- スロット番号の小さいほうから探し、空っぽのスロット番号を返す
- function getEmptySlot()
- for i=1, 16 do
- if turtle.getItemCount(i) == 0 then
- return i
- end
- end
- return false
- end
- -- slot0とslot1のアイテムを入れ替える。tmp_slotは入れ替え時に用いる一時アイテム置き場
- function changeItems(slot0, slot1, tmp_slot)
- if slot0 == slot1 then return end -- slot0とslot1が同じならすぐ終了
- if turtle.getItemCount(tmp_slot)>0 then return false, "tmp_slot must be empty." end
- if turtle.getItemCount(slot1)>0 then -- 移動先slot1が埋まっている
- if turtle.getItemCount(slot0)>0 then -- 移動先slot0も埋まっているので、一時置き場を使おう
- turtle.select(slot1)
- turtle.transferTo(tmp_slot) -- slot1のアイテムを退避
- turtle.select(slot0)
- turtle.transferTo(slot1) -- slot0のアイテムをslot1に移動
- turtle.select(tmp_slot)
- turtle.transferTo(slot0) -- 退避スロットのアイテムをslot1に移動
- else -- 移動先slot0があいているので slot1からslot0へ移動させよう
- turtle.select(slot1)
- turtle.transferTo(slot0)
- end
- else
- turtle.select(slot0)
- turtle.transferTo(slot1) -- slot0のアイテムをslot1に移動
- end
- end
- -- table.sort()で用いる比較関数の定義。名前順でダメージ値の順。
- -- _compare({name="minecraft:dirt", damage=0}, {name="minecraft:wool", damage=1})
- -- => true (名前のアルファベット順で左の方が前だから)
- -- _compare({name="minecraft:wool", damage=3}, {name="minecraft:wool", damage=1})
- -- => false (名前は同じだがダメージ値が後の方が小さいので)
- local function _compare(detail0, detail1)
- -- 引数がおかしいとエラー終了
- assert(detail0 and detail1 and detail0["name"] and detail1["name"] and detail0["damage"] and detail1["damage"])
- if detail0["name"] < detail1["name"] then
- return true -- detail0が名前順で前ならばtrue
- elseif detail0["name"] == detail1["name"] then
- -- detail0の名前が同じならばdamage値が小さければtrue
- return detail0["damage"] <= detail1["damage"]
- else
- return false -- detail0が名前順で後ろならばfalse
- end
- end
- -- ###################################################################
- function sortInventory()
- local tmp_slot = 16
- collectItem() -- まずは整理しようね。
- -- スロット16(tmp_slot)があいてない場合はエラー返して終了するよ
- if turtle.getItemCount(tmp_slot) > 0 then
- local empty_slot = getEmptySlot()
- if empty_slot == false then -- 空ける場所もないのでfalse終了
- return false, "Slot "..tmp_slot.." must be empty."
- else
- turtle.select(tmp_slot)
- turtle.transferTo(empty_slot)
- collectItem()
- end
- end
- -- インベントリアイテムの情報を収集するよ
- local items = {}
- for i=1,15 do
- local item = turtle.getItemDetail(i)
- if item then -- スロットにアイテムあります。
- table.insert(items, item)
- else
- -- スロットは空です。
- end
- end
- table.sort(items, _compare) -- 文字列順にソートじゃい。比較用関数は自分で作ったの使っています。
- for i,_item in ipairs(items) do
- selectItem(_item["name"], _item["damage"])
- local slot0 = turtle.getSelectedSlot()
- print(slot0..'->'..i)
- changeItems(slot0, i, tmp_slot)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement