ShadowNinja
2013-07-11 5d470cd753efe8f4640099165a7bfc0c6e181c35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
-- A geothermal EU generator
-- Using hot lava and water this device can create energy from steam
-- The machine is only producing LV EUs and can thus not drive more advanced equipment
-- The output is a little more than the coal burning generator (max 300EUs)
minetest.register_alias("geothermal", "technic:geothermal")
 
minetest.register_craft({
    output = 'technic:geothermal',
    recipe = {
        {'default:stone', 'default:stone', 'default:stone'},
        {'default:copper_ingot', 'default:diamond', 'default:copper_ingot'},
        {'default:stone', 'default:copper_ingot', 'default:stone'},
    }
})
 
minetest.register_craftitem("technic:geothermal", {
    description = "Geothermal Generator",
    stack_max = 99,
}) 
 
local geothermal_formspec =
    "invsize[8,4;]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
    "label[0,0;Geothermal Generator]"..
    "label[1,3;Power level]"..
    "list[current_player;main;0,5;8,4;]"
    
 
minetest.register_node(
   "technic:geothermal",
   {
      description = "Geothermal Generator",
      tiles = {"technic_geothermal_top.png", "technic_machine_bottom.png", "technic_geothermal_side.png",
           "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"},
      paramtype2 = "facedir",
      groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
      legacy_facedir_simple = true,
      sounds = default.node_sound_wood_defaults(),
      on_construct = function(pos)
            local meta = minetest.env:get_meta(pos)
            meta:set_string("infotext", "Geothermal Generator")
            meta:set_float("technic_power_machine", 1)
            meta:set_int("LV_EU_supply", 0)
            meta:set_string("formspec", geothermal_formspec)    
             end,    
   })
 
minetest.register_node(
   "technic:geothermal_active",
   {
      description = "Geothermal Generator",
      tiles = {"technic_geothermal_top_active.png", "technic_machine_bottom.png", "technic_geothermal_side.png",
           "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"},
      paramtype2 = "facedir",
      groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
      legacy_facedir_simple = true,
      sounds = default.node_sound_wood_defaults(),
      drop="technic:geothermal",
   })
 
local check_node_around = function(pos)
                 local node=minetest.env:get_node(pos)
                 if node.name=="default:water_source" or node.name=="default:water_flowing" then return 1 end
                 if node.name=="default:lava_source" or node.name=="default:lava_flowing" then return 2 end    
                 return 0
              end
 
minetest.register_abm(
   {
      nodenames = {"technic:geothermal","technic:geothermal_active"},
      interval = 1,
      chance   = 1,
      action = function(pos, node, active_object_count, active_object_count_wider)
          local meta             = minetest.env:get_meta(pos)
          local water_nodes      = 0
          local lava_nodes       = 0
          local production_level = 0
          local eu_supply        = 0
 
          -- Correct positioning is water on one side and lava on the other.
          -- The two cannot be adjacent because the lava the turns into obsidian or rock.
          -- To get to 100% production stack the water and lava one extra block down as well:
          --    WGL (W=Water, L=Lava, G=the generator, |=an LV cable)
                  --    W|L
          pos.x=pos.x+1
          local check=check_node_around(pos)
          if check==1 then water_nodes=water_nodes+1 end
          if check==2 then lava_nodes=lava_nodes+1 end
          pos.y=pos.y-1
          local check=check_node_around(pos)
          if check==1 then water_nodes=water_nodes+1 end
          if check==2 then lava_nodes=lava_nodes+1 end
 
          pos.x=pos.x-2
          check=check_node_around(pos)
          if check==1 then water_nodes=water_nodes+1 end
          if check==2 then lava_nodes=lava_nodes+1 end
          pos.y=pos.y+1
          check=check_node_around(pos)
          if check==1 then water_nodes=water_nodes+1 end
          if check==2 then lava_nodes=lava_nodes+1 end
 
          pos.x=pos.x+1
          pos.z=pos.z+1
          check=check_node_around(pos)
          if check==1 then water_nodes=water_nodes+1 end
          if check==2 then lava_nodes=lava_nodes+1 end
          pos.y=pos.y-1
          check=check_node_around(pos)
          if check==1 then water_nodes=water_nodes+1 end
          if check==2 then lava_nodes=lava_nodes+1 end
 
          pos.z=pos.z-2
          check=check_node_around(pos)
          if check==1 then water_nodes=water_nodes+1 end
          if check==2 then lava_nodes=lava_nodes+1 end
          pos.y=pos.y+1
          check=check_node_around(pos)
          if check==1 then water_nodes=water_nodes+1 end
          if check==2 then lava_nodes=lava_nodes+1 end
 
          -- Back to (0,0,0)
          pos.z=pos.z+1
    
          if water_nodes==1 and lava_nodes==1 then production_level =  25; eu_supply = 50 end
          if water_nodes==2 and lava_nodes==1 then production_level =  50; eu_supply = 100 end
          if water_nodes==1 and lava_nodes==2 then production_level =  75; eu_supply = 200 end
          if water_nodes==2 and lava_nodes==2 then production_level = 100; eu_supply = 300 end
 
          if production_level>0 then
             meta:set_int("LV_EU_supply", eu_supply)
          end
 
          local load = 1 -- math.floor((charge/max_charge)*100)
          meta:set_string("formspec",
                  "invsize[8,4;]"..
                     "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
                     (load)..":technic_power_meter_fg.png]"..
                  "label[0,0;Geothermal Generator]"..
                  "label[1,3;Power level]"..
                  "label[4,0;Production at "..tostring(production_level).."%]"
                )
                
          if production_level>0 and minetest.env:get_node(pos).name=="technic:geothermal" then
             hacky_swap_node (pos,"technic:geothermal_active")
             return
          end
          if production_level==0 then
             hacky_swap_node (pos,"technic:geothermal")
             meta:set_int("LV_EU_supply", 0)
          end
           end
   }) 
 
technic.register_LV_machine ("technic:geothermal","PR")
technic.register_LV_machine ("technic:geothermal_active","PR")