From 053fa59739f4b772174bf0a090969b3395ab3f98 Mon Sep 17 00:00:00 2001 From: kpoppel <poulsen.kim@gmail.com> Date: Tue, 02 Jul 2013 00:19:06 +0200 Subject: [PATCH] Merge pull request #38 from kpoppel/master --- technic/music_player.lua | 248 ++++++++++++++++++++++++++++--------------------- 1 files changed, 141 insertions(+), 107 deletions(-) diff --git a/technic/music_player.lua b/technic/music_player.lua index ecb1e09..e0520ff 100644 --- a/technic/music_player.lua +++ b/technic/music_player.lua @@ -1,9 +1,11 @@ +-- LV Music player. +-- The playe can play music. But it is high ampage! minetest.register_alias("music_player", "technic:music_player") minetest.register_craft({ output = 'technic:music_player', recipe = { {'default:wood', 'default:wood', 'default:wood'}, - {'technic:diamond', 'technic:diamond', 'technic:diamond'}, + {'default:diamond', 'default:diamond', 'default:diamond'}, {'default:stone', 'moreores:copper_ingot', 'default:stone'}, } }) @@ -11,112 +13,144 @@ minetest.register_craftitem("technic:music_player", { description = "Music Player", stack_max = 99, -}) - -music_player_formspec = - "invsize[8,9;]".. - "image[1,1;1,2;technic_power_meter_bg.png]".. - "label[0,0;Music Player]".. - "label[1,3;Power level]".. - "button[5,2;1,1;track1;1]".. - "button[6,2;1,1;track2;2]" - - -minetest.register_node("technic:music_player", { - description = "Music Player", - tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png", - "technic_music_player_side.png", "technic_music_player_side.png", "technic_music_player_side.png"}, - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), - technic_power_machine=1, - internal_EU_buffer=0, - internal_EU_buffer_size=5000, - music_player_on=0, - music_playing =0, - music_handle = 0, - music_player_current_track =1, - on_construct = function(pos) - local meta = minetest.env:get_meta(pos) - meta:set_string("infotext", "Music Player") - meta:set_float("technic_power_machine", 1) - meta:set_float("internal_EU_buffer", 1) - meta:set_float("internal_EU_buffer_size", 5000) - meta:set_string("formspec", music_player_formspec) - meta:set_float("music_player_on", 0) - meta:set_float("music_player_current_track", 1) - end, - - on_receive_fields = function(pos, formanme, fields, sender) - - local meta = minetest.env:get_meta(pos) - player_on=meta:get_float("music_player_on") - music_handle=meta:get_float("music_handle") - music_player_current_track=meta:get_float("music_player_current_track") - if fields.track1 then music_player_current_track=1 end - if fields.track2 then music_player_current_track=2 end - if fields.track3 then music_player_current_track=3 end - if fields.track4 then music_player_current_track=4 end - if fields.track5 then music_player_current_track=5 end - if fields.track6 then music_player_current_track=6 end - if fields.track7 then music_player_current_track=7 end - if fields.track8 then music_player_current_track=8 end - if fields.track9 then music_player_current_track=9 end - meta:set_float("music_player_current_track",music_player_current_track) - if fields.play and player_on==1 then - if music_handle then minetest.sound_stop(music_handle) end - music_handle=minetest.sound_play("technic_track"..music_player_current_track, {pos = pos, gain = 1.0,loop = true, max_hear_distance = 72,}) - meta:set_float("music_playing",1) - end - if fields.stop then - meta:set_float("music_playing",0) - if music_handle then minetest.sound_stop(music_handle) end - end - meta:set_float("music_handle",music_handle) - end, }) -minetest.register_abm({ - nodenames = {"technic:music_player"}, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.env:get_meta(pos) - local charge= meta:get_float("internal_EU_buffer") - local max_charge= meta:get_float("internal_EU_buffer_size") - player_on=meta:get_float("music_player_on") - music_player_current_track=meta:get_float("music_player_current_track") - local play_cost=80 - - if charge>play_cost then - if meta:get_float("music_playing")==1 then charge=charge-play_cost end - meta:set_float("internal_EU_buffer",charge) - meta:set_float("music_player_on",1) - else - meta:set_float("music_playing",0) - meta:set_float("music_player_on",0) - if music_handle then minetest.sound_stop(music_handle) end - end - local load = math.floor((charge/max_charge)*100) - meta:set_string("formspec", - "invsize[8,9;]".. - "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:".. - (load)..":technic_power_meter_fg.png]".. - "label[0,0;Music Player]".. - "label[1,3;Power level]".. - "button[4,1;1,1;track1;1]".. - "button[5,1;1,1;track2;2]".. - "button[6,1;1,1;track3;3]".. - "button[4,2;1,1;track4;4]".. - "button[5,2;1,1;track5;5]".. - "button[6,2;1,1;track6;6]".. - "button[4,3;1,1;track7;7]".. - "button[5,3;1,1;track8;8]".. - "button[6,3;1,1;track9;9]".. - "button[4,4;1,2;play;Play]".. - "button[6,4;1,2;stop;Stop]".. - "label[4,0;Current track "..tostring(music_player_current_track).."]" - ) - end -}) +local music_player_formspec = + "invsize[8,9;]".. + "label[0,0;Music Player]".. + "button[4,1;1,1;track1;1]".. + "button[5,1;1,1;track2;2]".. + "button[6,1;1,1;track3;3]".. + "button[4,2;1,1;track4;4]".. + "button[5,2;1,1;track5;5]".. + "button[6,2;1,1;track6;6]".. + "button[4,3;1,1;track7;7]".. + "button[5,3;1,1;track8;8]".. + "button[6,3;1,1;track9;9]".. + "button[4,4;1,2;play;Play]".. + "button[6,4;1,2;stop;Stop]".. + "label[4,0;Current track --]" -register_LV_machine ("technic:music_player","RE") +minetest.register_node( + "technic:music_player", + { + description = "Music Player", + tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png", + "technic_music_player_side.png", "technic_music_player_side.png", "technic_music_player_side.png"}, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("infotext", "Music Player") + meta:set_float("technic_power_machine", 1) + meta:set_int("active", 0) -- Is the device on? + meta:set_int("music_player_current_track", 1) + meta:set_string("formspec", music_player_formspec) + end, + on_receive_fields = function(pos, formanme, fields, sender) + local meta = minetest.env:get_meta(pos) + music_handle = meta:get_int("music_handle") + music_player_current_track = meta:get_int("music_player_current_track") + if fields.track1 then music_player_current_track = 1 end + if fields.track2 then music_player_current_track = 2 end + if fields.track3 then music_player_current_track = 3 end + if fields.track4 then music_player_current_track = 4 end + if fields.track5 then music_player_current_track = 5 end + if fields.track6 then music_player_current_track = 6 end + if fields.track7 then music_player_current_track = 7 end + if fields.track8 then music_player_current_track = 8 end + if fields.track9 then music_player_current_track = 9 end + meta:set_int("music_player_current_track",music_player_current_track) + if fields.play and meta:get_int("active") == 0 then + if music_handle then minetest.sound_stop(music_handle) end + music_handle = minetest.sound_play("technic_track"..music_player_current_track, {pos = pos, gain = 1.0,loop = true, max_hear_distance = 72,}) + meta:set_int("active",1) + end + if fields.stop then + meta:set_int("active",0) + if music_handle then minetest.sound_stop(music_handle) end + end + meta:set_int("music_handle",music_handle) + end, + }) + +minetest.register_abm( + { nodenames = {"technic:music_player"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.env:get_meta(pos) + local eu_input = meta:get_int("LV_EU_input") + local state = meta:get_int("state") + local next_state = state + + -- Machine information + local machine_name = "Music Player" + local machine_node = "technic:music_player" + local machine_state_demand = { 10, 150 } + + local music_handle = meta:get_int("music_handle") + + -- Setup meta data if it does not exist. state is used as an indicator of this + if state == 0 then + meta:set_int("state", 1) + meta:set_int("LV_EU_demand", machine_state_demand[1]) + meta:set_int("LV_EU_input", 0) + return + end + + -- Power off automatically if no longer connected to a switching station + technic.switching_station_timeout_count(pos, "LV") + + -- State machine + if eu_input == 0 then + -- unpowered - go idle + -- hacky_swap_node(pos, machine_node) -- if someday two nodes for this + meta:set_string("infotext", machine_name.." Unpowered") + next_state = 1 + elseif eu_input == machine_state_demand[state] then + -- Powered - do the state specific actions + if state == 1 then + -- hacky_swap_node(pos, machine_node) -- if someday two nodes for this + meta:set_string("infotext", machine_name.." Idle") + + if meta:get_int("active") == 1 then + next_state = 2 + end + + elseif state == 2 then + -- hacky_swap_node(pos, machine_node.."_active") -- if someday two nodes for this + meta:set_string("infotext", machine_name.." Active") + + music_player_current_track=meta:get_int("music_player_current_track") + meta:set_string("formspec", + "invsize[8,9;]".. + "label[0,0;Music Player]".. + "button[4,1;1,1;track1;1]".. + "button[5,1;1,1;track2;2]".. + "button[6,1;1,1;track3;3]".. + "button[4,2;1,1;track4;4]".. + "button[5,2;1,1;track5;5]".. + "button[6,2;1,1;track6;6]".. + "button[4,3;1,1;track7;7]".. + "button[5,3;1,1;track8;8]".. + "button[6,3;1,1;track9;9]".. + "button[4,4;1,2;play;Play]".. + "button[6,4;1,2;stop;Stop]".. + "label[4,0;Current track "..tostring(music_player_current_track).."]" + ) + if meta:get_int("active") == 0 then + if music_handle then minetest.sound_stop(music_handle) end + next_state = 1 + end + end + end + -- Change state? + if next_state ~= state then + meta:set_int("LV_EU_demand", machine_state_demand[next_state]) + meta:set_int("state", next_state) + end + end + }) + +technic.register_LV_machine ("technic:music_player","RE") -- Gitblit v1.8.0