Add all code

master
minermoder27 2013-12-19 12:01:48 +11:00
parent 0c01fab235
commit e783a8fe03
6 changed files with 451 additions and 0 deletions

1
depends.txt Normal file
View File

@ -0,0 +1 @@
itest

450
init.lua Normal file
View File

@ -0,0 +1,450 @@
reactors = {}
function reactors.get_formspec(pos, meta)
formspec = "size[14,9]"..
"list[context;charge;2,1;1,1;]"..
"list[current_player;main;0,5;8,4;]"
local meta = minetest.env:get_meta(pos)
local node = minetest.env:get_node(pos)
local percent = meta:get_int("energy")/get_node_field(node.name,meta,"max_energy")*100
local chrbar="image[3,2;2,1;itest_charge_bg.png^[lowpart:"..
percent..":itest_charge_fg.png^[transformR270]"
return formspec..chrbar.."list[context;main;6,0;8,4;]"..
"label[3,1;"..meta:get_int("heat").."]"..
"label[3.5,2;"..meta:get_int("energy").."]"
end
function reactors.on_construct(pos)
local meta = minetest.env:get_meta(pos)
meta:set_int("energy",0)
meta:set_int("on",0)
local inv = meta:get_inventory()
inv:set_size("main", 8*4)
inv:set_width("main", 8)
reactors.set_fs(pos, meta)
generators.on_construct(pos)
end
function reactors.set_fs(pos, meta)
meta:set_string("formspec", reactors.get_formspec(pos), meta)
end
function reactors.inventory(pos, listname, stack, power)
if listname=="charge" then
local chr = get_item_field(stack:get_name(),"charge_tier")
if chr~=nil and chr <= power then
return stack:get_count()
end
return 0
end
end
reactors.node = {
on_construct = function(pos)
reactors.on_construct(pos)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
if not inv:is_empty("main") then
return false
end
return generators.can_dig(pos,player)
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if listname == "main" then
return stack:get_count()
end
return reactors.inventory(pos, listname, stack, 3)
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
local stack = inv:get_stack(from_list, from_index)
if to_list == "main" then
return stack:get_count()
end
return reactors.inventory(pos, to_list, stack, 3)
end,
mesecons = {effector = {
rules = lightstone_rules,
action_off = function (pos, node)
local meta = minetest.env:get_meta(pos)
meta:set_int("on", 0)
end,
action_on = function (pos, node)
local meta = minetest.env:get_meta(pos)
meta:set_int("on", 1)
end,
}},
}
-------------------------------------
function reactors.get_table_for_item(name)
return minetest.registered_items[name]
end
function reactors.get_max_heat(pos)
return 10000
end
function reactors.emit(heat, eng, inv, x, y)
if x < 1 then return heat, eng end
if y < 1 then return heat, eng end
if x > inv:get_width("main") then return heat, eng end
if y > 8 then return heat, eng end
local i = x + y * inv:get_width("main")
local stack = inv:get_stack("main", i)
if stack:get_name()=="itest_reactors:uranium_cell" then
return heat + reactors.dissipateHeatFromCell(5, inv, x, y), eng + 10
end
return heat, eng
end
function reactors.dissipateHeatCellIsOK(inv, x, y)
if x < 1 then return false end
if y < 1 then return false end
if x > inv:get_width("main") then return false end
if y > 8 then return false end
local i = x + y * inv:get_width("main")
local stack = inv:get_stack("main", i)
local item = reactors.get_table_for_item(stack:get_name())
if item~=nil
and item.itest_reactor~=nil
and item.itest_reactor.acceptsHeat~=nil
and item.itest_reactor.acceptsHeat.flag==true then
return true
end
return false
end
function reactors.addHeatToCell(heat, inv, x, y)
if x < 1 then return false end
if y < 1 then return false end
if x > inv:get_width("main") then return false end
if y > 8 then return false end
local i = x + y * inv:get_width("main")
local item = reactors.get_table_for_item(inv:get_stack("main", i):get_name())
if item==nil or item.itest_reactor==nil or item.itest_reactor.max_heat==nil then return end
reactors.addWearToCell(heat * 65535 / item.itest_reactor.max_heat, inv, x, y, true)
end
function reactors.addWearToCell(wear, inv, x, y, doRemove)
if x < 1 then return false end
if y < 1 then return false end
if x > inv:get_width("main") then return false end
if y > 8 then return false end
local i = x + y * inv:get_width("main")
local stack = inv:get_stack("main", i):to_table()
if stack~=nil then
if stack.wear + wear < 65535 then
stack.wear = math.max(stack.wear + wear, 0)
inv:set_stack("main", i, stack)
return
end
if doRemove==true then
inv:set_stack("main", i, nil)
else
stack.wear = 65534
inv:set_stack("main", i, stack)
end
end
end
function reactors.getHeatInCell(inv, x, y)
if x < 1 then return false end
if y < 1 then return false end
if x > inv:get_width("main") then return false end
if y > 8 then return false end
local i = x + y * inv:get_width("main")
local stack = inv:get_stack("main", i):to_table()
local i = x + y * inv:get_width("main")
local item = reactors.get_table_for_item(inv:get_stack("main", i):get_name())
if item==nil or item.itest_reactor==nil or item.itest_reactor.max_heat==nil then return 0 end
return stack.wear * item.itest_reactor.max_heat / 65535
end
function reactors.dissipateHeatFromCellFinderSides(heat, inv, x, y, sides)
local count = 0
for name, val in pairs(sides) do
if reactors.dissipateHeatCellIsOK(inv, val.x, val.y)==false then
sides[name] = nil
else
count = count + 1
end
end
return sides, count
end
function reactors.dissipateHeatFromCellFinder(heat, inv, x, y)
local sides = {
t={x=x, y=y - 1}, -- top
b={x=x, y=y + 1}, -- bottom
l={x=x - 1, y=y}, -- left
r={x=x + 1, y=y}, -- right
}
local sides, count = reactors.dissipateHeatFromCellFinderSides(heat, inv, x, y, sides)
return sides, count
end
function reactors.dissipateHeatFromCell(heat, inv, x, y)
local sides, count = reactors.dissipateHeatFromCellFinder(heat, inv, x, y)
if count == 0 then
return heat
end
for name, val in pairs(sides) do
reactors.addHeatToCell(heat / count, inv, val.x, val.y)
end
return 0
end
function reactors.merge_heat(levels, inv, x, y)
local sides = {
r={x=x, y=y}, -- middle
t={x=x, y=y - 1}, -- top
b={x=x, y=y + 1}, -- bottom
l={x=x - 1, y=y}, -- left
r={x=x + 1, y=y}, -- right
}
local count = 0
sides, count = reactors.dissipateHeatFromCellFinderSides(heat, inv, x, y, sides)
local totalheat = 0
for name, val in pairs(sides) do
totalheat = totalheat + reactors.getHeatInCell(inv, val.x, val.y)
end
print(totalheat)
end
-------------------------------------
minetest.register_node("itest_reactors:reactor", {
description = "Reactor",
tiles = {"itest_generator_side.png", "itest_generator_side.png", "itest_generator_side.png",
"itest_generator_side.png", "itest_generator_side.png", "itest_generator_front.png"},
paramtype2 = "facedir",
groups = {energy=1, cracky=2},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
itest = {max_energy=40000,max_psize=512},
-----------------
on_construct = reactors.node.on_construct,
can_dig = reactors.node.can_dig,
allow_metadata_inventory_put = reactors.node.allow_metadata_inventory_put,
allow_metadata_inventory_move = reactors.node.allow_metadata_inventory_move,
mesecons = reactors.node.mesecons,
})
minetest.register_node("itest_reactors:reactor_active", {
description = "Reactor (active)",
tiles = {"itest_generator_side.png", "itest_generator_side.png", "itest_generator_side.png",
"itest_generator_side.png", "itest_generator_side.png", "itest_generator_front_active.png"},
paramtype2 = "facedir",
light_source = 8,
drop = "itest:generator",
groups = {energy=1, cracky=2, not_in_creative_inventory=1},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
itest = {max_energy=40000,max_psize=512},
-----------------
on_construct = reactors.node.on_construct,
can_dig = reactors.node.can_dig,
allow_metadata_inventory_put = reactors.node.allow_metadata_inventory_put,
mesecons = reactors.node.mesecons,
})
minetest.register_tool("itest_reactors:uranium_cell", {
description = "Uranium cell",
inventory_image = "itest_reactors_uranium_cell.png",
})
minetest.register_tool("itest_reactors:heat_vent_std", {
description = "Heat Vent",
inventory_image = "itest_reactors_heat_vent.png",
itest_reactor = {
dissipatesHeat = {
self = 6,
},
acceptsHeat = {
flag = true,
},
max_heat = 1000,
},
})
minetest.register_tool("itest_reactors:heat_vent_core", {
description = "Core Heat Vent",
inventory_image = "itest_reactors_heat_vent_core.png",
itest_reactor = {
dissipatesHeat = {
self = 5,
},
acceptsHeat = {
flag = true,
},
coreheat = {
fromcore = 5,
},
max_heat = 1000,
},
})
minetest.register_tool("itest_reactors:heat_vent_adv", {
description = "Advanced Heat Vent",
inventory_image = "itest_reactors_heat_vent_adv.png",
itest_reactor = {
dissipatesHeat = {
self = 12,
},
acceptsHeat = {
flag = true,
},
max_heat = 1000,
},
})
minetest.register_tool("itest_reactors:heat_vent_comp", {
description = "Component Heat Vent",
inventory_image = "itest_reactors_heat_vent_comp.png",
itest_reactor = {
dissipatesHeat = {
side = {
[{x = 1, y= 0}] = 4,
[{x =-1, y= 0}] = 4,
[{x = 0, y= 1}] = 4,
[{x = 0, y=-1}] = 4,
},
},
acceptsHeat = {
flag = true,
},
max_heat = 1000,
},
})
minetest.register_tool("itest_reactors:heat_vent_overc", {
description = "Overclocked Heat Vent",
inventory_image = "itest_reactors_heat_vent_overc.png",
itest_reactor = {
dissipatesHeat = {
self = 20,
},
acceptsHeat = {
flag = true,
},
coreheat = {
fromcore = 32,
},
max_heat = 1000,
},
})
------------------------------------------
minetest.register_tool("itest_reactors:heat_exc_std", {
description = "Heat Exchanger",
inventory_image = "itest_reactors_heat_exc.png",
itest_reactor = {
max_heat = 1000,
},
moves_heat = {
},
})
minetest.register_abm({
nodenames = {"itest_reactors:reactor","itest_reactors:reactor_active"},
interval = 1.0,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
if meta:get_string("heat") == "" then
meta:set_int("heat", 0)
end
local heat = meta:get_int("heat")
local eng = 0
--for i=1, inv:get_size("main") do
for x=1, inv:get_width("main") do
for y=1, inv:get_size("main") / inv:get_width("main") do
-- local x = ((i - 1) % inv:get_width("main")) + 1
-- local y = math.floor(i / inv:get_width("main")) + 1
local i = x + y * inv:get_width("main")
-- print(x .. "," .. y)
local stack = inv:get_stack("main", i)
if meta:get_int("on")==1 and stack:get_name()=="itest_reactors:uranium_cell" then
heat, eng = reactors.emit(heat, eng, inv, x, y) -- middle
heat, eng = reactors.emit(heat, eng, inv, x, y - 1) -- top
heat, eng = reactors.emit(heat, eng, inv, x, y + 1) -- bottom
heat, eng = reactors.emit(heat, eng, inv, x - 1, y) -- left
heat, eng = reactors.emit(heat, eng, inv, x + 1, y) -- right
reactors.addWearToCell(200000, inv, x, y)
end
local item = reactors.get_table_for_item(stack:get_name())
if item~=nil
and item.itest_reactor~=nil then
------------
if item.itest_reactor.moves_heat~=nil then
reactors.merge_heat(inv, x, y)
end
------------
if item.itest_reactor.dissipatesHeat~=nil then
if item.itest_reactor.dissipatesHeat.self~=nil then
reactors.addHeatToCell(-item.itest_reactor.dissipatesHeat.self, inv, x, y)
end
if item.itest_reactor.dissipatesHeat.side~=nil then
for ofsetpos, cooler_heat_count in pairs(item.itest_reactor.dissipatesHeat.side) do
reactors.addHeatToCell(-cooler_heat_count, inv, x + ofsetpos.x, y + ofsetpos.y)
end
end
end
if item.itest_reactor.coreheat~=nil
and item.itest_reactor.coreheat.fromcore~=nil then
local moveheat = math.min(5, heat)
heat = heat - moveheat
reactors.addHeatToCell(moveheat, inv, x, y)
end
-----------
end
end
end
heat = math.max(0, heat - 10)
meta:set_int("heat", heat)
-- print("energy: " .. eng .. " heat: " .. heat)
local m = get_node_field(node.name,meta,"max_energy")
local e = meta:get_int("energy")
meta:set_int("energy", math.min(m,eng+e))
for i=1, 3 do
e = meta:get_int("energy")
if e==0 then
break
end
local psize = math.min(512,e)
meta:set_int("energy", e-psize)
generators.produce(pos, psize)
end
reactors.set_fs(pos, meta)
-- if eng~=0 then
-- minetest.swap_node(pos, "itest_reactors:reactor_active")
-- else
-- minetest.swap_node(pos, "itest_reactors:reactor")
-- end
end,
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B