Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local input_chest = "actuallyadditions:giantchestlarge_0"
- --local princess_chest = "actuallyadditions:giantchestlarge_2"
- local bee_products_chest = "actuallyadditions:giantchestlarge_1"
- local bee_overflow_chest = "actuallyadditions:giantchestlarge_7"
- local apiaries = {peripheral.find "forestry:apiary"}
- local index = {}
- local bee_list = {}
- local storage = {peripheral.find("actuallyadditions:giantchestlarge", function(n) return n ~= input_chest and n ~= bee_products_chest and n ~= bee_overflow_chest end)}
- print("Got", #storage, "storage chests")
- local function find_free_space()
- for _, inv in pairs(storage) do
- if not inv.cached_size then inv.cached_size = inv.size() end
- local name = peripheral.getName(inv)
- if not index[name] then
- return name, 1
- end
- for slot = 1, inv.cached_size do
- if not index[name][slot] then return name, slot end
- end
- end
- end
- local function run_cleanup()
- for i = 1, peripheral.call(bee_overflow_chest, "size") do
- local bee = bee_list[1]
- local moved = peripheral.call(bee_overflow_chest, "pullItems", bee[1], bee[2])
- index[bee[1]][bee[2]].count = index[bee[1]][bee[2]].count - moved
- if index[bee[1]][bee[2]].count == 0 then
- index[bee[1]][bee[2]] = nil
- table.remove(bee_list, 1)
- end
- print("Eliminated", moved, "bees")
- end
- end
- local tol_table = {
- none = 0,
- both_1 = 3,
- both_2 = 4,
- both_3 = 6,
- up_1 = 1.5,
- down_1 = 1.5,
- up_2 = 2,
- down_2 = 2,
- up_3 = 3,
- down_3 = 3
- }
- local function score_genome_slot(g)
- local score = g.speed * 8 + (20 / g.lifespan) + g.fertility
- if g.never_sleeps then score = score + 5 end
- if g.tolerates_rain then score = score + 2 end
- if g.cave_dwelling then score = score + 5 end
- score = score + tol_table[g.humidity_tolerance]
- score = score + tol_table[g.temperature_tolerance]
- return score
- end
- local function score_bee(individual)
- return score_genome_slot(individual.genome.active) + 0.5 * score_genome_slot(individual.genome.inactive)
- end
- local function insert_into_list(bee, inv, slot)
- local score = score_bee(bee.bee_data)
- local lo, hi = 1, #bee_list + 1
- while lo < hi do
- local mid = math.floor((lo + hi) / 2)
- local compr_score = bee_list[mid][3]
- if score < compr_score then
- hi = mid
- else
- lo = mid + 1
- end
- end
- table.insert(bee_list, lo, { inv, slot, score })
- end
- local indexed_count = 0
- print "Bee indexing initiating"
- for _, chest in pairs(storage) do
- local name = peripheral.getName(chest)
- if not index[name] then index[name] = {} end
- for slot, item in pairs(chest.list()) do
- local meta = chest.getItemMeta(slot)
- index[name][slot] = { count = item.count, name = meta.displayName, bee_data = meta.individual }
- indexed_count = indexed_count + 1
- if indexed_count % 100 == 0 then sleep() print(indexed_count, "bees indexed") end
- end
- end
- print(indexed_count, "bees indexed")
- print "Bee list preload initiating"
- for inv, contents in pairs(index) do
- for slot, bee in pairs(contents) do
- insert_into_list(bee, inv, slot)
- end
- end
- while true do
- local modified_count = 0
- for slot, info in pairs(peripheral.call(input_chest, "list")) do
- if string.find(info.name, "drone") then
- local meta = peripheral.call(input_chest, "getItemMeta", slot)
- local invname, targslot = find_free_space()
- if not invname then
- printError "Bee store at capacity - initiating cleanup."
- run_cleanup()
- sleep(1)
- else
- local moved = peripheral.call(input_chest, "pushItems", invname, slot, 64, targslot)
- if not moved then
- printError "Bees nonmotile"
- sleep(1)
- else
- data = { count = moved, name = meta.displayName, bee_data = meta.individual }
- index[invname] = index[invname] or {}
- index[invname][targslot] = data
- modified_count = modified_count + 1
- insert_into_list(data, invname, targslot)
- end
- end
- elseif not string.find(info.name, "princess") then
- peripheral.call(input_chest, "pushItems", bee_products_chest, slot)
- end
- end
- print("Loaded", modified_count, "unique bees into stores")
- modified_count = 0
- for _, apiary in pairs(apiaries) do
- local content = apiary.list()
- if not content[1] then -- need princess
- print "Loading princess"
- local success = false
- for slot, ccontent in pairs(peripheral.call(input_chest, "list")) do
- if ccontent and string.find(ccontent.name, "princess") then
- peripheral.call(input_chest, "pushItems", peripheral.getName(apiary), slot)
- success = true
- break
- end
- end
- if not success then
- printError "Insufficient princesses"
- sleep(1)
- end
- end
- if not content[2] then
- print "Loading drone"
- local bee = table.remove(bee_list)
- if not bee then
- printError "Drone not found"
- sleep(1)
- else
- local moved = peripheral.call(bee[1], "pushItems", peripheral.getName(apiary), bee[2])
- index[bee[1]][bee[2]].count = index[bee[1]][bee[2]].count - moved
- if index[bee[1]][bee[2]].count == 0 then
- index[bee[1]][bee[2]] = nil
- end
- modified_count = modified_count + 1
- end
- end
- sleep(0.05)
- end
- print("Moved", modified_count, "drones")
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement