From c6da0a6713e1dc77838d180987256bda62dbb19b Mon Sep 17 00:00:00 2001 From: RealBadAngel Date: Wed, 20 Mar 2013 03:46:35 +0100 Subject: [PATCH] Added Forcefield generator by ShadowNinja --- technic/forcefield.lua | 213 ++++++++++++++++++ technic/init.lua | 1 + .../textures/technic_forcefield_animated.png | Bin 0 -> 3274 bytes .../technic_forcefield_emitter_off.png | Bin 0 -> 204 bytes .../technic_forcefield_emitter_on.png | Bin 0 -> 204 bytes 5 files changed, 214 insertions(+) create mode 100644 technic/forcefield.lua create mode 100644 technic/textures/technic_forcefield_animated.png create mode 100644 technic/textures/technic_forcefield_emitter_off.png create mode 100644 technic/textures/technic_forcefield_emitter_on.png diff --git a/technic/forcefield.lua b/technic/forcefield.lua new file mode 100644 index 0000000..ebefc52 --- /dev/null +++ b/technic/forcefield.lua @@ -0,0 +1,213 @@ +--Forcefield mod by ShadowNinja + +local forcefield_emitter_buffer_size = 10000 +local forcefield_emitter_power_consumption = 1 +local forcefield_update_interval = 1 + +minetest.register_craft({ + output = 'technic:forcefield_emitter_off', + recipe = { + {'default:mese', 'technic:deployer_off', 'default:mese' }, + {'technic:deployer_off', 'technic:motor', 'technic:deployer_off'}, + {'default:mese', 'technic:deployer_off', 'default:mese' }, + } +}) + +local function get_forcefield_count(range) + local count = 0 + for x=-range,range do + for y=0,range do + for z=-range,range do + if ((x*x+y*y+z*z) <= (range * range + range)) then + if (y == 0) or ((range-1) * (range-1) + (range-1) <= x*x+y*y+z*z) then + count = count + 1 + end + end + end + end + end + return count +end + +local function add_forcefield(pos, range) + for x=-range,range do + for y=-range,range do + for z=-range,range do + if ((x*x+y*y+z*z) <= (range * range + range)) then + if ((range-1) * (range-1) + (range-1) <= x*x+y*y+z*z) then + local np={x=pos.x+x,y=pos.y+y,z=pos.z+z} + local n = minetest.env:get_node(np).name + if (n == "air") then + minetest.env:add_node(np, {name = "technic:forcefield"}) + end + end + end + end + end + end + return true +end + +local function remove_forcefield(p, range) + for x=-range,range do + for y=-range,range do + for z=-range,range do + if ((x*x+y*y+z*z) <= (range * range + range)) then + if ((range-1) * (range-1) + (range-1) <= x*x+y*y+z*z) then + local np={x=p.x+x,y=p.y+y,z=p.z+z} + local n = minetest.env:get_node(np).name + if (n == "technic:forcefield") then + minetest.env:remove_node(np) + end + end + end + end + end + end +end + +forcefield_receive_fields = function(pos, formname, fields, sender) + local meta = minetest.env:get_meta(pos) + local range = meta:get_int("range") + if fields.add then range = range + 1 end + if fields.subtract then range = range - 1 end + if range <= 20 and range >= 0 and meta:get_int("range") ~= range then + remove_forcefield(pos, meta:get_int("range")) + meta:set_int("range", range) + local buffer = meta:get_float("internal_EU_buffer") + local buffer_size = meta:get_float("internal_EU_buffer_size") + local load = math.floor(buffer / buffer_size * 100) + meta:set_string("formspec", get_forcefield_formspec(range, 0)) + end +end + +function get_forcefield_formspec(range, load) + if not load then load = 0 end + return "invsize[8,9;]".. + "label[0,0;Forcefield emitter]".. + "label[1,3;Power level]".. + "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:".. + load..":technic_power_meter_fg.png]".. + "label[4,1;Range]".. + "label[4,2;"..range.."]".. + "button[3,2;1,1;add;+]".. + "button[5,2;1,1;subtract;-]".. + "list[current_player;main;0,5;8,4;]" +end + +local function forcefield_check(pos) + local meta = minetest.env:get_meta(pos) + local node = minetest.env:get_node(pos) + local internal_EU_buffer=meta:get_float("internal_EU_buffer") + local internal_EU_buffer_size=meta:get_float("internal_EU_buffer_size") + + local load = math.floor(internal_EU_buffer/internal_EU_buffer_size * 100) + meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range"), load)) + + local power_requirement = get_forcefield_count(meta:get_int("range")) * forcefield_emitter_power_consumption + if meta:get_int("mesecons_powered") == 0 and internal_EU_buffer >= power_requirement then + if node.name == "technic:forcefield_emitter_off" then + hacky_swap_node(pos, "technic:forcefield_emitter_on") + minetest.env:get_node_timer(pos):start(forcefield_update_interval) + end + internal_EU_buffer=internal_EU_buffer-power_requirement; + meta:set_float("internal_EU_buffer", internal_EU_buffer) + add_forcefield(pos, meta:get_int("range")) + else + remove_forcefield(pos, meta:get_int("range")) + if node.name == "technic:forcefield_emitter_on" then + hacky_swap_node(pos, "technic:forcefield_emitter_off") + minetest.env:get_node_timer(pos):start(forcefield_update_interval) + end + end + return true + +end + +minetest.register_node("technic:forcefield_emitter_off", { + description = "Forcefield emitter", + inventory_image = minetest.inventorycube("technic_forcefield_emitter_off.png"), + tiles = {"technic_forcefield_emitter_off.png"}, + is_ground_content = true, + groups = {cracky = 1}, + technic_power_machine=1, + on_timer = forcefield_check, + on_receive_fields = forcefield_receive_fields, + on_construct = function(pos) + minetest.env:get_node_timer(pos):start(forcefield_update_interval) + local meta = minetest.env:get_meta(pos) + meta:set_float("technic_power_machine", 1) + meta:set_float("internal_EU_buffer", 0) + meta:set_float("internal_EU_buffer_size", forcefield_emitter_buffer_size) + meta:set_int("range", 10) + meta:set_int("mesecons_powered", 0) + meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range", 0))) + meta:set_string("infotext", "Forcefield emitter"); + end, + mesecons = {effector = { + action_on = function (pos, node) + minetest.env:get_meta(pos):set_int("mesecons_powered", 1) + end, + action_off = function(pos, node) + minetest.env:get_meta(pos):set_int("mesecons_powered", 0) + end + }} +}) + +minetest.register_node("technic:forcefield_emitter_on", { + description = "Forcefield emitter on (you hacker you)", + tiles = {"technic_forcefield_emitter_on.png"}, + is_ground_content = true, + groups = {cracky = 1, not_in_creative_inventory=1}, + drop='"technic:forcefield_emitter_off" 1', + on_timer = forcefield_check, + on_receive_fields = forcefield_receive_fields, + on_construct = function(pos) + minetest.env:get_node_timer(pos):start(forcefield_update_interval) + local meta = minetest.env:get_meta(pos) + meta:set_float("technic_power_machine", 1) + meta:set_float("internal_EU_buffer", 0) + meta:set_float("internal_EU_buffer_size", forcefield_emitter_buffer_size) + meta:set_int("range", 10) + meta:set_int("mesecons_powered", 0) + meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range"), 0)) + meta:set_string("infotext", "Forcefield emitter"); + end, + on_dig = function(pos, node, digger) + remove_forcefield(pos, minetest.env:get_meta(pos):get_int("range")) + return minetest.node_dig(pos, node, digger) + end, + technic_power_machine=1, + mesecons = {effector = { + action_on = function(pos, node) + minetest.env:get_meta(pos):set_int("mesecons_powered", 1) + end, + action_off = function(pos, node) + minetest.env:get_meta(pos):set_int("mesecons_powered", 0) + end + }} +}) + +minetest.register_node("technic:forcefield", { + description = "Forcefield (you hacker you)", + sunlight_propagates = true, + drop = '', + tiles = {{name="technic_forcefield_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}}, + is_ground_content = true, + groups = {not_in_creative_inventory=1, unbreakable=1}, + paramtype = "light", + drawtype = "nodebox", + node_box = { --hacky way to get the field blue and not see through the ground + type = "fixed", + fixed={ + {-.5,-.5,-.5,.5,.5,.5}, + }, + }, +}) + +register_MV_machine ("technic:forcefield_emitter_on","RE") +register_MV_machine ("technic:forcefield_emitter_off","RE") + + + + diff --git a/technic/init.lua b/technic/init.lua index 8ffa9c7..9b25ccf 100644 --- a/technic/init.lua +++ b/technic/init.lua @@ -43,6 +43,7 @@ dofile(modpath.."/battery_box_mv.lua") dofile(modpath.."/solar_panel_mv.lua") dofile(modpath.."/electric_furnace_mv.lua") dofile(modpath.."/alloy_furnace_mv.lua") +dofile(modpath.."/forcefield.lua") --Tools if enable_mining_drill==true then dofile(modpath.."/mining_drill.lua") end diff --git a/technic/textures/technic_forcefield_animated.png b/technic/textures/technic_forcefield_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..7763840c1970e8884c93f89a1466b2af48391519 GIT binary patch literal 3274 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 IM6N<$f>KULd;kCd literal 0 HcmV?d00001 diff --git a/technic/textures/technic_forcefield_emitter_off.png b/technic/textures/technic_forcefield_emitter_off.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4582f9edc4dbcd8ba24863601913098cf0ecee GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DinK$vl=HlH+5kiEpy*OmPa53d-H&`r@r>wrR$o-U3d7N?W<6g@pv&&I{T&CJYv zc(!@|iAy?4N{0>{aZpTfG@mHZ@Fs~zJmd8X10a5os?6NA_dvzdQ&ayNs84*wx~9?M rRV(8MChm12ZaNG6;uNmEyurX=f7QrcUcPn_&=LkuS3j3^P6{aZpTfG@mHZ@Fs~z{Kbn5V<3K