changed serialize function to be deterministic
This commit is contained in:
parent
d4d1211f13
commit
86d64d1583
@ -123,7 +123,7 @@ local function apiary_node_timer(pos,elapsed)
|
|||||||
minetest.chat_send_all("prova")
|
minetest.chat_send_all("prova")
|
||||||
local new_queen = forestry_bees.format_bee(monarchlist[1])
|
local new_queen = forestry_bees.format_bee(monarchlist[1])
|
||||||
local drone_genes = forestry_bees.return_all_genes_double(string.sub(string.match(string.match(new_queen:get_name(),":.*"),".*_"),2,-2))
|
local drone_genes = forestry_bees.return_all_genes_double(string.sub(string.match(string.match(new_queen:get_name(),":.*"),".*_"),2,-2))
|
||||||
new_queen:get_meta():set_string("drone_genes", minetest.serialize(drone_genes))
|
new_queen:get_meta():set_string("drone_genes", forestry_bees.serialize(drone_genes))
|
||||||
inv:set_stack("monarch",1,new_queen)
|
inv:set_stack("monarch",1,new_queen)
|
||||||
monarchlist = inv:get_list("monarch")
|
monarchlist = inv:get_list("monarch")
|
||||||
end
|
end
|
||||||
@ -139,7 +139,7 @@ local function apiary_node_timer(pos,elapsed)
|
|||||||
--if actionable check if things are ready
|
--if actionable check if things are ready
|
||||||
if actionable then
|
if actionable then
|
||||||
--ternary expression if can_breed it evals to breedtime else lifetime
|
--ternary expression if can_breed it evals to breedtime else lifetime
|
||||||
needed_time = (can_breed and {breedtime} or { tonumber(forestry_bees.settings:get("lifespan_multiplier")) * minetest.deserialize(monarchlist[1]:get_meta():get_string("genes"))["lifespan"][1]})[1]
|
needed_time = (can_breed and {breedtime} or { tonumber(forestry_bees.settings:get("lifespan_multiplier")) * forestry_bees.deserialize(monarchlist[1]:get_meta():get_string("genes"))["lifespan"][1]})[1]
|
||||||
el = math.min(el, needed_time - src_time)
|
el = math.min(el, needed_time - src_time)
|
||||||
src_time = src_time + el
|
src_time = src_time + el
|
||||||
|
|
||||||
@ -289,12 +289,14 @@ minetest.register_node("forestry_bees:apiary", apply_logger({
|
|||||||
insert_object = function(pos, node, stack, direction)
|
insert_object = function(pos, node, stack, direction)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
|
minetest.get_node_timer(pos):start(1.0)
|
||||||
if minetest.get_item_group(stack:get_name(),"bee_drone") == 1 then
|
if minetest.get_item_group(stack:get_name(),"bee_drone") == 1 then
|
||||||
return inv:add_item('drone', stack)
|
return inv:add_item('drone', stack)
|
||||||
end
|
end
|
||||||
if minetest.get_item_group(stack:get_name(),"bee_monarch") == 1 then
|
if minetest.get_item_group(stack:get_name(),"bee_monarch") == 1 then
|
||||||
return inv:add_item('monarch', stack)
|
return inv:add_item('monarch', stack)
|
||||||
end
|
end
|
||||||
|
|
||||||
end,
|
end,
|
||||||
can_insert = function(pos, node, stack, direction)
|
can_insert = function(pos, node, stack, direction)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
|
@ -1,23 +1,50 @@
|
|||||||
--function forestry_bees.Bee(bee_type,active_type_gene,inactive_type_gene,active_fertility_gene,inactive_fertility_gene)
|
function forestry_bees.serialize(t)
|
||||||
--local itemstack = ItemStack({name = forestry_bees.bee_name(bee_type,active_type_gene)})
|
-- i know that core.serialize exists but it is non deterministic
|
||||||
--itemstack:get_meta():set_string("active_type_gene",active_type_gene)
|
-- for bees and thus creates bees with the same "genes" table but
|
||||||
--itemstack:get_meta():set_string("inactive_type_gene",inactive_type_gene)
|
-- a different "genes" string, thus making different itemstacks
|
||||||
--itemstack:get_meta():set_string("active_fertility_gene",active_fertility_gene)
|
-- for this reason this function is necessary
|
||||||
--itemstack:get_meta():set_string("inactive_fertility_gene",inactive_fertility_gene)
|
|
||||||
--return itemstack
|
-- the tables in this mod are like {"a"={1,2},"b"={"c","d"}}
|
||||||
--end
|
-- for this reason the function is much simpler
|
||||||
|
local function add_gene(str, tab, label)
|
||||||
|
local t2 = tab[label]
|
||||||
|
return str .. label .."\t"..tostring(t2[1]).."\t"..tostring(t2[2]).."\t\n"
|
||||||
|
end
|
||||||
|
local result = ""
|
||||||
|
for i, label in ipairs({"type_gene", "production", "fertility", "lifespan",
|
||||||
|
"nocturnal", "cave", "flyer", "flower", "radius"}) do
|
||||||
|
result = add_gene(result, t, label)
|
||||||
|
end
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
function forestry_bees.deserialize(str)
|
||||||
|
--same as above
|
||||||
|
local function unravel(str1)
|
||||||
|
local first_gene_str = string.match(str1,"^(.-)\n")
|
||||||
|
local iter = string.gmatch(first_gene_str,"(.-)\t")
|
||||||
|
local label = iter()
|
||||||
|
local result_tab = {iter(), iter()}
|
||||||
|
return label, result_tab, string.match(str1,"\n(.+)")
|
||||||
|
end
|
||||||
|
local fin_tab = {}
|
||||||
|
local label, result_tab, rest_str = unravel(str)
|
||||||
|
fin_tab[label] = result_tab
|
||||||
|
while rest_str do
|
||||||
|
label, result_tab, rest_str = unravel(rest_str)
|
||||||
|
fin_tab[label] = result_tab
|
||||||
|
end
|
||||||
|
return fin_tab
|
||||||
|
end
|
||||||
|
|
||||||
function forestry_bees.Bee(bee_type,genes)
|
function forestry_bees.Bee(bee_type,genes)
|
||||||
local itemstack = ItemStack({name = forestry_bees.bee_name(bee_type,genes["type_gene"][1])}) --the "1" is cuz the table genes["type_gene"] has 2 entries: active and inactive
|
local itemstack = ItemStack({name = forestry_bees.bee_name(bee_type,genes["type_gene"][1])}) --the "1" is cuz the table genes["type_gene"] has 2 entries: active and inactive
|
||||||
itemstack:get_meta():set_string("genes", minetest.serialize(genes))
|
itemstack:get_meta():set_string("genes", forestry_bees.serialize(genes))
|
||||||
--for gene_type,gene in pairs(genes) do
|
|
||||||
-- itemstack:get_meta():set_string(gene_type,gene)
|
|
||||||
--end
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
function forestry_bees.can_queen_work(queen, pos)
|
function forestry_bees.can_queen_work(queen, pos)
|
||||||
local genes = minetest.deserialize(queen:get_meta():get_string("genes"))
|
local genes = forestry_bees.deserialize(queen:get_meta():get_string("genes"))
|
||||||
local biome_data = minetest.get_biome_data(pos)
|
local biome_data = minetest.get_biome_data(pos)
|
||||||
local biome_name = minetest.get_biome_name(biome_data["biome"])
|
local biome_name = minetest.get_biome_name(biome_data["biome"])
|
||||||
local humidity = biome_data["humidity"]
|
local humidity = biome_data["humidity"]
|
||||||
@ -34,7 +61,7 @@ function forestry_bees.can_queen_work(queen, pos)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function forestry_bees.calculate_drop(bee)
|
function forestry_bees.calculate_drop(bee)
|
||||||
local genes = minetest.deserialize(bee:get_meta():get_string("genes"))
|
local genes = forestry_bees.deserialize(bee:get_meta():get_string("genes"))
|
||||||
local possible_drops = forestry_bees.bee_drops[genes["type_gene"][1]] --this gets us a table
|
local possible_drops = forestry_bees.bee_drops[genes["type_gene"][1]] --this gets us a table
|
||||||
local out_table = {}
|
local out_table = {}
|
||||||
for drop,chance in pairs(possible_drops) do
|
for drop,chance in pairs(possible_drops) do
|
||||||
@ -68,8 +95,8 @@ function forestry_bees.format_bee(bee)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function forestry_bees.breed_princess_drone(princess,drone)
|
function forestry_bees.breed_princess_drone(princess,drone)
|
||||||
local princess_genes = minetest.deserialize(princess:get_meta():get_string("genes")) --princess_meta["genes"]
|
local princess_genes = forestry_bees.deserialize(princess:get_meta():get_string("genes")) --princess_meta["genes"]
|
||||||
local drone_genes = minetest.deserialize(drone:get_meta():get_string("genes"))
|
local drone_genes = forestry_bees.deserialize(drone:get_meta():get_string("genes"))
|
||||||
--fix for missing genes in bees, if we have bees with missing genes we just give them the default ones
|
--fix for missing genes in bees, if we have bees with missing genes we just give them the default ones
|
||||||
if princess_genes == nil then
|
if princess_genes == nil then
|
||||||
local princess_type = string.sub(string.match(string.match(princess:get_name(),":.*"),".*_"),2,-2)
|
local princess_type = string.sub(string.match(string.match(princess:get_name(),":.*"),".*_"),2,-2)
|
||||||
@ -81,7 +108,7 @@ function forestry_bees.breed_princess_drone(princess,drone)
|
|||||||
end
|
end
|
||||||
local queen = forestry_bees.Bee("queen",princess_genes)
|
local queen = forestry_bees.Bee("queen",princess_genes)
|
||||||
local queen_meta = queen:get_meta()
|
local queen_meta = queen:get_meta()
|
||||||
queen_meta:set_string("drone_genes",minetest.serialize(drone_genes))
|
queen_meta:set_string("drone_genes",forestry_bees.serialize(drone_genes))
|
||||||
return queen
|
return queen
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -173,8 +200,8 @@ end
|
|||||||
function forestry_bees.apiary_result(queen, pos)
|
function forestry_bees.apiary_result(queen, pos)
|
||||||
--given a queen calculates the correct princess + drone output
|
--given a queen calculates the correct princess + drone output
|
||||||
local meta = queen:get_meta()
|
local meta = queen:get_meta()
|
||||||
local mother_genes = minetest.deserialize(meta:get_string("genes"))
|
local mother_genes = forestry_bees.deserialize(meta:get_string("genes"))
|
||||||
local father_genes = minetest.deserialize(meta:get_string("drone_genes"))
|
local father_genes = forestry_bees.deserialize(meta:get_string("drone_genes"))
|
||||||
local genes = output_genes(mother_genes,father_genes,pos)
|
local genes = output_genes(mother_genes,father_genes,pos)
|
||||||
--local genes = final_gene(mother_chosen_gene, father_chosen_gene)
|
--local genes = final_gene(mother_chosen_gene, father_chosen_gene)
|
||||||
local princess = forestry_bees.Bee("princess", genes)
|
local princess = forestry_bees.Bee("princess", genes)
|
||||||
|
Loading…
Reference in New Issue
Block a user