diff --git a/mods/lobby/buttons.lua b/mods/lobby/buttons.lua index 7a0d35c..b76b33c 100644 --- a/mods/lobby/buttons.lua +++ b/mods/lobby/buttons.lua @@ -310,12 +310,15 @@ minetest.register_node('lobby:button_1', { if player_count >= needed_players then if lobby.map[map_id] == 0 or lobby.map[map_id] == nil then minetest.chat_send_player(name, 'you can start the game!') + minetest.log('action', name..' just started a game on '..map_id) lobby.map[map_id] = player_count lobby.update_stats(map_id, 'player', '', player_count) local traitor = math.random(1, player_count) lobby.xp[map_id] = 0 lobby.votes[map_id] = 0 lobby.corpses[map_id] = {} + lobby.sabotage[map_id] = false + lobby.sabotage_level[map_id] = 0 for i=1,player_count do minetest.chat_send_player(map_players[i], 'Hold tight, loading the level.') local player = minetest.get_player_by_name(map_players[i]) diff --git a/mods/lobby/chat_commands.lua b/mods/lobby/chat_commands.lua index 481501c..733d122 100644 --- a/mods/lobby/chat_commands.lua +++ b/mods/lobby/chat_commands.lua @@ -189,8 +189,10 @@ minetest.register_chatcommand('checkxp', { local map_id = lobby.game[name] if map_id ~= 'lobby' then local xp = lobby.xp[map_id] + local game_data = lobby.savedata.data[map_id] + local required_xp = game_data['xp'] if xp then - minetest.chat_send_player(name, 'Currently have '..xp..' xp on this level.') + minetest.chat_send_player(name, 'You currently have '..xp..' xp on this level. A total of '..required_xp..' is needed to defeat the traitor.') else minetest.chat_send_player(name, 'Welp, no XP here?') end diff --git a/mods/lobby/lobby.lua b/mods/lobby/lobby.lua index 12cd8cf..7acda12 100644 --- a/mods/lobby/lobby.lua +++ b/mods/lobby/lobby.lua @@ -10,6 +10,8 @@ lobby.corpses = {} lobby.vote_timer = {} lobby.spawn_pos = {x=29996, y=-4.5, z=30041.5} lobby.spawn_pos = minetest.setting_get_pos('traitor_lobby_spawn') or lobby.spawn_pos +lobby.sabotage = {} +lobby.sabotage_level = {} lobby.stat = {} --Yes I know these table names are not very clear. diff --git a/mods/lobby/player_callbacks.lua b/mods/lobby/player_callbacks.lua index de36179..b0e2761 100644 --- a/mods/lobby/player_callbacks.lua +++ b/mods/lobby/player_callbacks.lua @@ -95,6 +95,7 @@ minetest.register_on_respawnplayer(function(player) local player_attributes = player:get_meta() local pos = minetest.string_to_pos(player_attributes:get_string('spawn_pos')) local map_id = lobby.game[name] + minetest.log('action', name..' just respawned on '..map_id) local mode = player_attributes:get_string('mode') player:set_armor_groups({immortal=1}) minetest.chat_send_player(name, 'You are immortal for 10 seconds.') @@ -103,7 +104,8 @@ minetest.register_on_respawnplayer(function(player) minetest.chat_send_player(name, 'Immortallity has ended.') end) if map_id ~= 'lobby' and mode == 'ghost' then - if lobby.map[map_id] and lobby.map[map_id] > 1 then + local real_id = string.sub(map_id, 0, -7) + if lobby.map[real_id] and lobby.map[real_id] > 1 then player:set_pos(pos) return true else diff --git a/mods/sabotage/formspecs.lua b/mods/sabotage/formspecs.lua index 6a46011..3b53794 100644 --- a/mods/sabotage/formspecs.lua +++ b/mods/sabotage/formspecs.lua @@ -1,6 +1,6 @@ function sabotage.traitor_formspec(pos) local meta = minetest.get_meta(pos) - local timer = meta:get_int('timer') or 120 + local timer = meta:get_int('timer') or 0 local chance = meta:get_int('chance') or 1 local damage = meta:get_int('damage') or 1 local formspec = @@ -9,8 +9,8 @@ function sabotage.traitor_formspec(pos) 'textarea[.5,.5;9,6;;;Sabotage the crew, and risk life and limb. '.. 'If the crew doesn\'t fix it in time you win, but you could die sabotaging.\n'.. 'If you fail in sabotaging you could take up '..damage..' damage. '.. - 'The other players will be alerted and have time to attempt to \'repair\' the node, '.. - 'if they are successful they win the round, otherwise you win!'.. + 'If the Failure Timer is greater than 30 you will win or loose depending on if the crew \'repairs\' the node.'.. + 'If they repair the node in time they win, but if they don\'t you win!'.. '\n\nRisk Factor: '..chance..'/10 \nPotential Health Impact: '..damage..' \nFailure Timer: '..timer..' seconds]'.. 'button_exit[3.5,7;3,.75;sabotage;Do It]' return formspec @@ -22,20 +22,26 @@ function sabotage.builder_formspec(pos) local chance = meta:get_int('chance') or 1 local damage = meta:get_int('damage') or 1 local alert = meta:get_string('alert') or '' + local level = meta:get_int('level') or 0 local formspec = 'formspec_version[3]'.. 'size[16,9]'.. - 'textarea[1,1;14,4;;;Sabotaging is a risky business, the traitor can fail and take damage. '.. - 'Chance is the probability of failure when attempting to sabotage. (1-10 Traitor\'s luck level comes in play here.)'.. - 'Damage is the MAX amount of damage the traitor will incur. Keep in mind the default health level is 20.'.. - 'Timer is the amount of time the crew is given to \'repair\' the sabotaged node before the traitor wins the level. Must be over 30 seconds.\n'.. - 'Alert text will be sent to all players on the level, \n'.. - 'and should include something to let them know where/what was sabotaged and needs to be fixed. \n'.. - 'This will be a chat message. The node description will also be included in the HUD display.]'.. + 'textarea[1,1;14,3.5;;;Sabotaging is a risky business, the traitor can fail and take damage. '.. + 'Chance is the probability of failure when attempting to sabotage. (1-10 Traitor\'s luck level comes in play here.)\n'.. + 'Damage is the MAX amount of damage the traitor will incur. Keep in mind the default health level is 20.\n'.. + 'Timer is the amount of time the crew is given to \'repair\' the sabotaged node. Must be over 30 seconds. '.. + 'Set below 30 seconds to not use a timer. Effect will last until crew repairs it.\n'.. + 'Alert text will be sent to all players on the level, '.. + 'and should include something to let them know where/what was sabotaged and needs to be fixed.\n'.. + 'This will be a chat message. The node description will also be included in the HUD display.\n'.. + 'Sabotage level controls which tasks can be completed, or nodes can be interacted with. '.. + 'Sabotage can be in levels 1-4, configurable nodes can have levels defined, if the level is BELOW the sabotage level it can still be interacted with. '.. + 'Currently this is in BETA, and many nodes do not care about this data.]'.. 'textarea[1,5;14,1;alert;Alert Text:;'..alert..']'.. 'field[1,6.5;2.5,.75;chance;Chance:;'..chance..']'.. 'field[6.75,6.5;2.5,.75;damage;Damage:;'..damage..']'.. - 'field[12.5,6.5;2.5,.75;timer;Timer:;'..timer..']'.. + 'field[12.5,6.5;2.5,.75;timer_input;Timer:;'..timer..']'.. + 'field[14,6.5;2.5,.75;level;Sabotage level:;'..level..']'.. 'button_exit[6.5,7.5;3,1;save;Save]' return formspec end diff --git a/mods/sabotage/functions.lua b/mods/sabotage/functions.lua index e027099..22a9caf 100644 --- a/mods/sabotage/functions.lua +++ b/mods/sabotage/functions.lua @@ -1,49 +1,67 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local name = player:get_player_name() + local map_id = lobby.game[name] if formname == 'sabotage:traitor' then local pos = sabotage.player_pos[name] local meta = minetest.get_meta(pos) if fields.sabotage then - local chance = meta:get_int('chance') or 1 - local damage = meta:get_int('damage') or 1 - local player_attributes = player:get_meta() - local luck = player_attributes:get_int('luck') - if math.random(10) + luck >= chance then - local hurt = math.random(damage) - local health = player:get_hp() - local new_health = health - hurt - player:set_hp(new_health) - end - if math.random(10) + luck >= chance then - local node = minetest.get_node(pos).name - local def = minetest.registered_nodes[node] - local desc = def.description - local map_id = lobby.game[name] - meta:set_string('traitor', name) - meta:set_string('map_id', map_id) - meta:set_string('sabotaged', 'true') - local time = meta:get_int('timer') - local timer = minetest.get_node_timer(pos) - local alert = meta:get_string('alert') - timer:start(time) - lobby.message_to_level(map_id, 'Warning!!! Level has been sabotaged. Proceed with caution!!!') - lobby.message_to_level(map_id, alert) - minetest.chat_send_player(name, 'You dirty dog, you just doomed the lives of all other players.') - sabotage.show_hud(map_id, time, desc) - sabotage.timer[map_id] = time + local sabotaged = lobby.sabotage[map_id] + if sabotaged == true then + minetest.chat_send_player(name, 'Sorry you can only sabotage one item at a time currently.') + else + local chance = meta:get_int('chance') or 1 + local damage = meta:get_int('damage') or 1 + local level = meta:get_int('level') or 0 + local player_attributes = player:get_meta() + local luck = player_attributes:get_int('luck') + if math.random(10) + luck >= chance then + local hurt = math.random(damage) + local health = player:get_hp() + local new_health = health - hurt + player:set_hp(new_health) + end + if math.random(10) + luck >= chance then + local node = minetest.get_node(pos).name + local def = minetest.registered_nodes[node] + local desc = def.description + meta:set_string('traitor', name) + meta:set_string('map_id', map_id) + meta:set_string('sabotaged', 'true') + lobby.sabotage[map_id] = true + local time = meta:get_int('timer') + if time > 29 then + local timer = minetest.get_node_timer(pos) + timer:start(time) + sabotage.show_hud_timed(map_id, time, desc) + sabotage.timer[map_id] = time + elseif time < 30 then + sabotage.show_hud(map_id, desc) + end + local alert = meta:get_string('alert') + local level = meta:get_int('level') or 0 + lobby.message_to_level(map_id, 'Warning!!! Level has been sabotaged. Proceed with caution!!!') --needs changing + lobby.message_to_level(map_id, alert) + minetest.chat_send_player(name, 'You dirty dog, you just doomed the lives of all other players.') --needs changing + lobby.sabotage_level[map_id] = level + end end end elseif formname == 'sabotage:builder' then local pos = sabotage.player_pos[name] local meta = minetest.get_meta(pos) if fields.save then - local timer = math.max((tonumber(fields.timer) or 30), 30) - local chance = math.min((fields.chance or 2), 10) - local damage = fields.damage or 1 + local timer = tonumber(fields.timer_input) or 0 + if timer < 30 then + timer = 0 + end + local chance = math.min((tonumber(fields.chance) or 2), 10) + local damage = tonumber(fields.damage) or 1 local alert = fields.alert or '' + local level = math.min((tonumber(fields.level) or 0), 4) meta:set_int('timer', timer) meta:set_int('chance', chance) meta:set_int('damage', damage) + meta:set_int('level', level) meta:set_string('sabotaged', 'false') meta:set_string('alert', alert) end @@ -62,12 +80,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) player:set_hp(new_health) end if math.random(10) + luck >= chance then - local map_id = lobby.game[name] - local timer = minetest.get_node_timer(pos) + local time = meta:get_int('timer') sabotage.clear_hud(map_id) meta:set_string('sabotaged', 'false') - timer:stop() - lobby.team_win(map_id) + lobby.sabotage_level[map_id] = 0 + lobby.sabotage[map_id] = false + if time > 29 then + local timer = minetest.get_node_timer(pos) + timer:stop() + lobby.team_win(map_id) + elseif time < 30 then + local node = minetest.get_node(pos).name + local def = minetest.registered_nodes[node] + local desc = def.description + lobby.message_to_level(map_id, name..' just fixed '..desc) + end end end end diff --git a/mods/sabotage/huds.lua b/mods/sabotage/huds.lua index fe00ee6..de6cb8a 100644 --- a/mods/sabotage/huds.lua +++ b/mods/sabotage/huds.lua @@ -1,4 +1,4 @@ -function sabotage.show_hud(map_id, timer, desc) +function sabotage.show_hud_timed(map_id, timer, desc) for _, player in pairs(minetest.get_connected_players()) do local name = player:get_player_name() if lobby.game[name] == map_id then @@ -40,15 +40,18 @@ function sabotage.clear_hud(map_id) local name = player:get_player_name() if lobby.game[name] == map_id then local idx = sabotage.hud[name] - player:hud_remove(idx.title) - player:hud_remove(idx.timer) - player:hud_remove(idx.desc) + for key,value in pairs(idx) do + player:hud_remove(value) + end end end end function sabotage.update_hud(map_id) local time = sabotage.timer[map_id] - 1 + if time < 0 then + return + end sabotage.timer[map_id] = time for _, player in pairs(minetest.get_connected_players()) do local name = player:get_player_name() @@ -57,9 +60,33 @@ function sabotage.update_hud(map_id) player:hud_change(idx.timer, 'text', time..' seconds') end end - if time > 0 then - minetest.after(1, function() - sabotage.update_hud(map_id) - end) + minetest.after(1, function() + sabotage.update_hud(map_id) + end) +end + +function sabotage.show_hud(map_id, desc) + for _, player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + if lobby.game[name] == map_id then + sabotage.hud[name] = { + desc = player:hud_add({ + hud_elem_type = 'text', + position = {x = 1, y = 0.125}, + offset = {x = -20, y = -20}, + text = 'Find '..desc, + alignment = {x = -1, y = 0}, + scale = {x = 100, y = 100}, + }), + title = player:hud_add({ + hud_elem_type = 'text', + position = {x = 1, y = 0.125}, + offset = {x = -20, y = 0}, + text = 'Items still require repairs!!!', + alignment = {x = -1, y = 0}, + scale = {x = 100, y = 100}, + }), + } + end end end diff --git a/mods/sabotage/init.lua b/mods/sabotage/init.lua index eb14609..9b0d6d4 100644 --- a/mods/sabotage/init.lua +++ b/mods/sabotage/init.lua @@ -2,6 +2,7 @@ sabotage = {} sabotage.player_pos = {} sabotage.hud = {} sabotage.timer = {} +sabotage.level = {} dofile(minetest.get_modpath('sabotage')..'/formspecs.lua') dofile(minetest.get_modpath('sabotage')..'/functions.lua') diff --git a/mods/sabotage/nodes.lua b/mods/sabotage/nodes.lua index 4a7d6c0..aa016be 100644 --- a/mods/sabotage/nodes.lua +++ b/mods/sabotage/nodes.lua @@ -1,8 +1,7 @@ ---[[minetest.register_node('sabotage:test', { +minetest.register_node('sabotage:test', { description = 'Sabotage Testing', tiles = {'sabotage_test.png'}, - groups = {breakable=1, not_in_creative_inventory=1}, + groups = {breakable=1, sabotage=1, not_in_creative_inventory=1}, on_rightclick = sabotage.on_rightclick, on_timer = sabotage.on_timer }) -]] diff --git a/mods/sfinv/init.lua b/mods/sfinv/init.lua index 1acbc88..27708c6 100644 --- a/mods/sfinv/init.lua +++ b/mods/sfinv/init.lua @@ -17,7 +17,8 @@ sfinv.register_page('sfinv:help', { local mode = player_attributes:get_string('mode') if not creative.is_enabled_for(player:get_player_name()) then return sfinv.make_formspec(player, context, - 'textarea[.25,0;2,2;;;Player Stats:\n XP: '..xp..'\n HP: '..health..'\n Luck: '..luck..']'.. + 'textarea[.25,0;2,3;;;Player Stats:\n XP: '..xp..'\n HP: '..health..'\n Luck: '..luck..'\n'.. + 'Playing as:\n '..mode..']'.. 'textarea[2,0;6.5,5.5;;; Traitor is a game based on Among Us. '.. 'Your goal is to vote out the traitor if you are not the traitor, or to kill all the other players if you are the traitor. '.. 'Visit the shop to buy upgrades, privileges, and at some point cosmetics!\n\n'.. @@ -25,7 +26,8 @@ sfinv.register_page('sfinv:help', { , true) else return sfinv.make_formspec(player, context, - 'textarea[.25,0;2,2;;;Player Stats:\n XP: '..xp..'\n HP: '..health..'\n Luck: '..luck..']'.. + 'textarea[.25,0;2,3;;;Player Stats:\n XP: '..xp..'\n HP: '..health..'\n Luck: '..luck..'\n'.. + 'Playing as:\n '..mode..']'.. 'textarea[2,0;6.5,10.5;;; As a builder you have the ability to create your own levels, individually or collaboratively with other builders. '.. 'Build any size and with any theme, your imagination is the only limit. (Contact the admin if you need specific nodes/tasks.) '.. 'The spawn area on the level needs to be at minimum 5x5 to prevent players from spawning inside of objects or outside of the map.\n\n'.. diff --git a/mods/tasks/campfire.lua b/mods/tasks/campfire.lua index fbc75cc..334723d 100644 --- a/mods/tasks/campfire.lua +++ b/mods/tasks/campfire.lua @@ -77,6 +77,7 @@ minetest.register_node('tasks:campfire_1', { meta:set_int('time_min', 240) meta:set_int('time_max', 600) meta:set_int('xp', 1) + meta:set_int('level', 0) end, on_rightclick = tasks.right_click, on_timer = function(pos) diff --git a/mods/tasks/code.lua b/mods/tasks/code.lua index edfa701..d7a76ab 100644 --- a/mods/tasks/code.lua +++ b/mods/tasks/code.lua @@ -31,8 +31,21 @@ minetest.register_node('tasks:code_0', { light_source = 14, selection_box = box, collision_box = box, - on_construct = tasks.on_contruct, - on_rightclick = tasks.right_click, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int('time_min', 240) + meta:set_int('time_max', 600) + meta:set_int('xp', 1) + meta:set_int('level', 0) + end, + on_rightclick = function(pos, node, clicker) + local timer = minetest.get_node_timer(pos) + local meta = minetest.get_meta(pos) + local min = meta:get_int('time_min') or 30 + local max = meta:get_int('time_max') or 60 + local random_number = math.random(min,max) + timer:start(random_number) + end, on_timer = function(pos) local node = minetest.get_node(pos) minetest.swap_node(pos, {name = 'tasks:code_1', param2 = node.param2}) diff --git a/mods/tasks/configurator.lua b/mods/tasks/configurator.lua index 4a9fd41..d24a22b 100644 --- a/mods/tasks/configurator.lua +++ b/mods/tasks/configurator.lua @@ -14,6 +14,8 @@ minetest.register_tool('tasks:configurator', { doors.lock(pos, name) elseif minetest.get_item_group(node.name, 'stash') > 0 then tasks.stash(pos, name) + elseif minetest.get_item_group(node.name, 'sabotage') > 0 then + sabotage.on_punch(pos, node, user) end end end @@ -27,7 +29,8 @@ function tasks.configure(pos, name) local time_min = meta:get_int('time_min') or 60 local time_max = meta:get_int('time_max') or 120 local xp = meta:get_int('xp') or 5 - minetest.show_formspec(name, 'tasks:configuration', tasks.configuration_formspec(infotext, time_min, time_max, xp)) + local level = meta:get_int('level') or 4 + minetest.show_formspec(name, 'tasks:configuration', tasks.configuration_formspec(infotext, time_min, time_max, xp, level)) end minetest.register_on_player_receive_fields(function(player, formname, fields) @@ -35,13 +38,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if formname == 'tasks:configuration' then if fields.save then if tasks.is_integer(fields.time_min) and tasks.is_integer(fields.time_max) and tasks.is_integer(fields.xp) - and tonumber(fields.time_max) >= tonumber(fields.time_min) then + and tonumber(fields.time_max) >= tonumber(fields.time_min) and tasks.is_integer(fields.level) then local pos = tasks.player_config[name] local meta = minetest.get_meta(pos) local timer = minetest.get_node_timer(pos) meta:set_int('time_min', math.max(fields.time_min,5)) meta:set_int('time_max', math.max(fields.time_max,20)) meta:set_int('xp', fields.xp) + meta:set_int('level', math.min(fields.level, 4)) meta:set_string('infotext', fields.infotext) local random_number = math.random(fields.time_min, fields.time_max) timer:start(random_number) @@ -52,18 +56,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) -function tasks.configuration_formspec(infotext, time_min, time_max, xp) +function tasks.configuration_formspec(infotext, time_min, time_max, xp, level) local formspec = 'formspec_version[3]'.. 'size[8,6]'.. 'textarea[.5,.5;7,2;;;Set the minimum and maximum time a task will run before breaking down, and the XP to be awarded upon completion of the task. '.. 'Minimum time must be 5 or more seconds, and max time must be 20 or more seconds. Whole numbers only.\n'.. - 'Pro-tip, set the min and max times the same to remove randomization.]'.. + 'Pro-tip, set the min and max times the same to remove randomization.\n'.. + 'You can ignore the level input if you aren\'t adding a node you can sabotage.]'.. 'field[1,3;6,.5;infotext;Infotext;'..infotext..']'.. 'field[1,4;2,.5;time_min;Minimum time;'..time_min..']'.. 'field[5,4;2,.5;time_max;Maximum time;'..time_max..']'.. - 'field[1,5;2,.5;xp;XP;'..xp..']'.. - 'button_exit[5,5;2,.5;save;Submit]' + 'field[1,5;1.5,.5;xp;XP;'..xp..']'.. + 'field[3.25,5;1.5,.5;level;Level;'..level..']'.. + 'button_exit[5.5,5;1.5,.5;save;Submit]' return formspec end diff --git a/mods/tasks/engine_0.lua b/mods/tasks/engine_0.lua index 34523c1..b200957 100644 --- a/mods/tasks/engine_0.lua +++ b/mods/tasks/engine_0.lua @@ -2,14 +2,18 @@ local formspec_good = 'size[6,3]'.. 'textarea[1,1;5,2;;;This reactor is performing at peak efficiency.]' -local formspec_bad = - 'size[8,6]'.. - 'textarea[.5,;5,2;;;Looks like something is broke.\nGet a new part from a storage locker.]' .. - 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. - 'list[current_name;part;6,1;1,1;]'.. - 'list[current_player;main;0,3;8,3;]'.. - 'listring[current_player;main]'.. - 'listring[current_name;part]' +local function formspec_bad(pos) + local spos = pos.x ..','.. pos.y ..','.. pos.z + local formspec = + 'size[8,6]'.. + 'textarea[.5,;5,2;;;Looks like something is broke.\nGet a new part from a storage locker.]' .. + 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. + 'list[nodemeta:'..spos..';part;6,1;1,1;]'.. + 'list[current_player;main;0,3;8,3;]'.. + 'listring[current_player;main]'.. + 'listring[nodemeta:'..spos..';part]' + return formspec +end minetest.register_node('tasks:engine_0_on',{ description = 'Arc Reactor', @@ -29,18 +33,16 @@ minetest.register_node('tasks:engine_0_on',{ groups = {breakable = 1, tasks=1, plays_sound=1}, _sound = 'tasks_engine_0_run', on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string('formspec', formspec_good) - meta:set_string('infotext', 'Arc Reactor') - tasks.on_construct(pos) + tasks.on_construct(pos, 'Arc Reactor') + end, + on_rightclick = function(pos, node, clicker) + tasks.right_click_on(pos, node, clicker, formspec_good) end, - on_rightclick = tasks.right_click, on_timer = function(pos) local node = minetest.get_node(pos) local meta = minetest.get_meta(pos) local infotext = meta:get_string('infotext') minetest.sound_play('tasks_engine_0_stop', {pos = pos, gain = 1, max_hear_distance = 10}) - meta:set_string('formspec', formspec_bad) meta:set_string('infotext', infotext..' (Needs repair!)') minetest.after(11, function() minetest.swap_node(pos, {name = 'tasks:engine_0_off', param2 = node.param2}) @@ -60,15 +62,10 @@ minetest.register_node('tasks:engine_0_off',{ light_source = 2, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, drop = 'tasks:engine_0_on', - on_receive_fields = function(pos, formname, fields, sender) - if fields ['gimme'] then - local player_inv = sender:get_inventory() - if not player_inv:contains_item('main', {name='tasks:gear_req', count = 4}) then - player_inv:add_item('main', 'tasks:gear_req') - else - minetest.chat_send_player(sender:get_player_name(), 'You have too many of these already.') - end - end + req_form = 'tasks:gear_req', + req_count = 4, + on_rightclick = function(pos, node, clicker) + tasks.right_click_off(pos, node, clicker, formspec_bad(pos)) end, allow_metadata_inventory_put = function(pos, listname, index, stack) if listname == 'part' then @@ -93,7 +90,7 @@ minetest.register_node('tasks:engine_0_off',{ inv:set_stack('part', 1, '') minetest.sound_play('tasks_engine_0_start', {pos = pos, gain = 1, max_hear_distance = 10}) minetest.swap_node(pos, {name = 'tasks:engine_0_on', param2 = node.param2}) - meta:set_string('formspec', formspec_good) + minetest.close_formspec(name, 'tasks:part_req_form') meta:set_string('infotext', infotext) tasks.only_add_xp(xp, name) timer:start(random_number) diff --git a/mods/tasks/engine_1.lua b/mods/tasks/engine_1.lua index 097aaf1..fb12a3a 100644 --- a/mods/tasks/engine_1.lua +++ b/mods/tasks/engine_1.lua @@ -2,14 +2,18 @@ local formspec_good = 'size[6,3]'.. 'textarea[1,1;5,2;;;This plasma accelerator is performing at peak efficiency.]' -local formspec_bad = - 'size[8,6]'.. - 'textarea[.5,;5,2;;;Looks like something is broke.\nGet a new part from a storage locker.]' .. - 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. - 'list[current_name;part;6,1;1,1;]'.. - 'list[current_player;main;0,3;8,3;]'.. - 'listring[current_player;main]'.. - 'listring[current_name;part]' +local function formspec_bad(pos) + local spos = pos.x ..','.. pos.y ..','.. pos.z + local formspec = + 'size[8,6]'.. + 'textarea[.5,;5,2;;;Looks like something is broke.\nGet a new part from a storage locker.]' .. + 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. + 'list[nodemeta:'..spos..';part;6,1;1,1;]'.. + 'list[current_player;main;0,3;8,3;]'.. + 'listring[current_player;main]'.. + 'listring[nodemeta:'..spos..';part]' + return formspec +end minetest.register_node('tasks:engine_1_on',{ description = 'Plasma Accelerator', @@ -28,18 +32,16 @@ minetest.register_node('tasks:engine_1_on',{ _sound = 'tasks_engine_1_run', groups = {breakable = 1, tasks=1, plays_sound=1}, on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string('formspec', formspec_good) - meta:set_string('infotext', 'Plasma Accelerator') - tasks.on_construct(pos) + tasks.on_construct(pos, 'Plasma Accelerator') + end, + on_rightclick = function(pos, node, clicker) + tasks.right_click_on(pos, node, clicker, formspec_good) end, - on_rightclick = tasks.right_click, on_timer = function(pos) local node = minetest.get_node(pos) local meta = minetest.get_meta(pos) local infotext = meta:get_string('infotext') minetest.sound_play('tasks_engine_1_stop', {pos = pos, gain = 1, max_hear_distance = 5}) - meta:set_string('formspec', formspec_bad) meta:set_string('infotext', infotext..' (Needs repair!)') minetest.after(5, function() minetest.swap_node(pos, {name = 'tasks:engine_1_off', param2 = node.param2}) @@ -58,15 +60,10 @@ minetest.register_node('tasks:engine_1_off',{ light_source = 2, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, drop = 'tasks:engine_1_on', - on_receive_fields = function(pos, formname, fields, sender) - if fields ['gimme'] then - local player_inv = sender:get_inventory() - if not player_inv:contains_item('main', {name='tasks:plasma_core_req', count = 4}) then - player_inv:add_item('main', 'tasks:plasma_core_req') - else - minetest.chat_send_player(sender:get_player_name(), 'You have too many of these already.') - end - end + req_form = 'tasks:plasma_core_req', + req_count = 4, + on_rightclick = function(pos, node, clicker) + tasks.right_click_off(pos, node, clicker, formspec_bad(pos)) end, allow_metadata_inventory_put = function(pos, listname, index, stack) if listname == 'part' then @@ -91,7 +88,7 @@ minetest.register_node('tasks:engine_1_off',{ inv:set_stack('part', 1, '') minetest.sound_play('tasks_engine_1_start', {pos = pos, gain = 1, max_hear_distance = 10}) minetest.swap_node(pos, {name = 'tasks:engine_1_on', param2 = node.param2}) - meta:set_string('formspec', formspec_good) + minetest.close_formspec(name, 'tasks:part_req_form') meta:set_string('infotext', infotext) tasks.only_add_xp(xp, name) timer:start(random_number) diff --git a/mods/tasks/example.lua b/mods/tasks/example.lua index a4ec1a8..d691a37 100644 --- a/mods/tasks/example.lua +++ b/mods/tasks/example.lua @@ -5,7 +5,9 @@ minetest.register_node('tasks:example_0', { --This node is inactive, so somebody tiles = {name='task_1.png'}, groups = {breakable=1, not_in_creative_inventory=1, tasks=1}, light_source = 14, - on_construct = tasks.on_construct, + on_construct = function(pos) + tasks.on_construct(pos, 'infotext') + end, on_timer = function(pos) local this_node = minetest.get_node(pos) minetest.swap_node(pos, {name = 'tasks:example_1', param2 = this_node.param2}) diff --git a/mods/tasks/forcefield_gen.lua b/mods/tasks/forcefield_gen.lua index dd2491c..2662aaf 100644 --- a/mods/tasks/forcefield_gen.lua +++ b/mods/tasks/forcefield_gen.lua @@ -2,16 +2,20 @@ local formspec_good = 'size[6,3]'.. 'textarea[1,1;5,2;;;Working Fine.]' -local formspec_bad = - 'formspec_version[3]'.. - 'size[10.5,7]'.. - 'textarea[.5,.5;5,1;;;Shields down!!!\nNew Quantum Coil Needed ASAP.]' .. - 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. - 'list[current_name;part;8,1.5;1,1;]'.. - 'list[current_player;main;.5,3;8,3;]'.. - 'listring[current_player;main]'.. - 'listring[current_name;part]'.. - 'image[8,1.5;1,1;tasks_quantum_coil_line.png]' +local function formspec_bad(pos) + local spos = pos.x ..','.. pos.y ..','.. pos.z + local formspec = + 'formspec_version[3]'.. + 'size[10.5,7]'.. + 'textarea[.5,.5;5,1;;;Shields down!!!\nNew Quantum Coil Needed ASAP.]' .. + 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. + 'list[nodemeta:'..spos..';part;8,1.5;1,1;]'.. + 'list[current_player;main;.5,3;8,3;]'.. + 'listring[current_player;main]'.. + 'listring[nodemeta:'..spos..';part]'.. + 'image[8,1.5;1,1;tasks_quantum_coil_line.png]' + return formspec +end local on_box = { type = 'fixed', @@ -36,23 +40,17 @@ minetest.register_node('tasks:forcefield_gen_on',{ collision_box = on_box, groups = {breakable = 1, tasks=1}, on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string('formspec', formspec_good) - meta:set_string('infotext', 'Forcefield Generator') - meta:set_int('time_min', 300) - meta:set_int('time_max', 600) - meta:set_int('xp', 10) - tasks.on_construct(pos) + tasks.on_construct(pos, 'Forcefield Generator') + end, + on_rightclick = function(pos, node, clicker) + tasks.right_click_on(pos, node, clicker, formspec_good) end, - on_rightclick = tasks.right_click, on_timer = function(pos) local node = minetest.get_node(pos) local meta = minetest.get_meta(pos) local infotext = meta:get_string('infotext') - meta:set_string('formspec', formspec_bad) meta:set_string('infotext', infotext..' (Needs repair!)') minetest.swap_node(pos, {name = 'tasks:forcefield_gen_off', param2 = node.param2}) - --minetest.sound_play('tasks_smoke_alarm_chirp', {pos = pos, gain = 2, max_hear_distance = 14}) end, }) @@ -67,15 +65,10 @@ minetest.register_node('tasks:forcefield_gen_off',{ collision_box = off_box, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, drop = 'tasks:forcefield_gen_on', - on_receive_fields = function(pos, formname, fields, sender) - if fields ['gimme'] then - local player_inv = sender:get_inventory() - if not player_inv:contains_item('main', {name='tasks:quantum_coil_req', count = 2}) then - player_inv:add_item('main', 'tasks:quantum_coil_req') - else - minetest.chat_send_player(sender:get_player_name(), 'You have too many of these already.') - end - end + req_form = 'tasks:quantum_coil_req', + req_count = 2, + on_rightclick = function(pos, node, clicker) + tasks.right_click_off(pos, node, clicker, formspec_bad(pos)) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) if listname == 'part' then @@ -105,7 +98,7 @@ minetest.register_node('tasks:forcefield_gen_off',{ local infotext = string.sub(meta:get_string('infotext'), 1, -17) inv:set_stack('part', 1, '') minetest.swap_node(pos, {name = 'tasks:forcefield_gen_on', param2 = node.param2}) - meta:set_string('formspec', formspec_good) + minetest.close_formspec(name, 'tasks:part_req_form') meta:set_string('infotext', infotext) tasks.only_add_xp(xp, name) timer:start(random_number) diff --git a/mods/tasks/functions.lua b/mods/tasks/functions.lua index 9130b7a..38500a5 100644 --- a/mods/tasks/functions.lua +++ b/mods/tasks/functions.lua @@ -33,6 +33,7 @@ function tasks.add_xp(pos, node, puncher, swap_to) --This function shouldn't be lobby.xp[map_id] = lobby.xp[map_id] + earned_xp local needed_xp = game_data['xp'] - lobby.xp[map_id] minetest.chat_send_player(name, 'You just earned '..earned_xp..' XP for your team.\nYou need '..needed_xp..' more XP to defeat the imposter.') + minetest.log('action', map_id..': Gained '..xp..' still '..needed_xp..' required to complete leve.') tasks.check_xp(map_id, needed_xp) else lobby.give_xp(puncher, 1) @@ -63,6 +64,7 @@ function tasks.only_add_xp(xp, name) -- This function only adds XP, you are resp lobby.xp[map_id] = lobby.xp[map_id] + xp local needed_xp = game_data['xp'] - lobby.xp[map_id] minetest.chat_send_player(name, 'You just earned '..xp..' XP for your team.\nYou need '..needed_xp..' more XP to defeat the imposter.') + minetest.log('action', map_id..': Gained '..xp..' still '..needed_xp..' required to complete leve.') tasks.check_xp(map_id, needed_xp) else lobby.give_xp(player, 1) @@ -75,22 +77,40 @@ function tasks.only_add_xp(xp, name) -- This function only adds XP, you are resp end end -function tasks.right_click(pos, node, clicker) +function tasks.right_click_on(pos, node, clicker, formspec) local timer = minetest.get_node_timer(pos) local meta = minetest.get_meta(pos) local min = meta:get_int('time_min') or 30 local max = meta:get_int('time_max') or 60 local random_number = math.random(min,max) timer:start(random_number) + minetest.show_formspec(clicker:get_player_name(), 'tasks:good', formspec) + meta:set_string('formspec', '') end -function tasks.on_construct(pos) +function tasks.right_click_off(pos, node, clicker, formspec) + local name = clicker:get_player_name() + local map_id = lobby.game[name] + local sabotage_level = lobby.sabotage_level[map_id] or 0 + local meta = minetest.get_meta(pos) + local level = meta:get_int('level') or 0 + if level >= sabotage_level then + tasks.player_config[name] = pos + minetest.show_formspec(name, 'tasks:part_req_form', formspec) + else + minetest.chat_send_player(name, 'level is currently sabotaged, and you can\'t do this now.') + end +end + +function tasks.on_construct(pos, infotext) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size('part', 1) + meta:set_string('infotext', infotext) meta:set_int('time_min', 30) meta:set_int('time_max', 90) meta:set_int('xp', 5) + meta:set_int('level', 0) end function tasks.is_integer(input) @@ -110,3 +130,22 @@ function tasks.valid_input(string) return true end end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if formname == 'tasks:part_req_form'then + if fields.gimme then + local pos = tasks.player_config[name] + local node = minetest.get_node(pos).name + local def = minetest.registered_nodes[node] + local item = def.req_form + local max = def.req_count + local player_inv = player:get_inventory() + if not player_inv:contains_item('main', {name = item, count = max}) then + player_inv:add_item('main', item) + else + minetest.chat_send_player(name, 'You have too many of these already.') + end + end + end +end) diff --git a/mods/tasks/printing_press.lua b/mods/tasks/printing_press.lua index a099be3..3732c5d 100644 --- a/mods/tasks/printing_press.lua +++ b/mods/tasks/printing_press.lua @@ -2,16 +2,20 @@ local formspec_good = 'size[6,3]'.. 'textarea[1,1;5,2;;;Paper stock OK.]' -local formspec_bad = -'formspec_version[3]'.. - 'size[10.5,7]'.. - 'textarea[.5,.5;5,1;;;No paper!\nPrinting halted!]' .. - 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. - 'list[current_name;part;8,1.5;1,1;]'.. - 'list[current_player;main;.5,3;8,3;]'.. - 'listring[current_player;main]'.. - 'listring[current_name;part]'.. - 'image[8,1.5;1,1;tasks_paper_stack_line.png]' +local function formspec_bad(pos) + local spos = pos.x ..','.. pos.y ..','.. pos.z + local formspec = + 'formspec_version[3]'.. + 'size[10.5,7]'.. + 'textarea[.5,.5;5,1;;;No paper!\nPrinting halted!]' .. + 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. + 'list[nodemeta:'..spos..';part;8,1.5;1,1;]'.. + 'list[current_player;main;.5,3;8,3;]'.. + 'listring[current_player;main]'.. + 'listring[nodemeta:'..spos..';part]'.. + 'image[8,1.5;1,1;tasks_paper_stack_line.png]' + return formspec +end local box = { type = 'fixed', @@ -30,20 +34,15 @@ minetest.register_node('tasks:printing_press_on',{ collision_box = box, groups = {breakable = 1, tasks=1}, on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string('formspec', formspec_good) - meta:set_string('infotext', 'Printing Press') - meta:set_int('time_min', 300) - meta:set_int('time_max', 600) - meta:set_int('xp', 10) - tasks.on_construct(pos) + tasks.on_construct(pos, 'Printing Press') + end, + on_rightclick = function(pos, node, clicker) + tasks.right_click_on(pos, node, clicker, formspec_good) end, - on_rightclick = tasks.right_click, on_timer = function(pos) local node = minetest.get_node(pos) local meta = minetest.get_meta(pos) local infotext = meta:get_string('infotext') - meta:set_string('formspec', formspec_bad) meta:set_string('infotext', infotext..' (Needs paper!)') minetest.swap_node(pos, {name = 'tasks:printing_press_off', param2 = node.param2}) end, @@ -60,15 +59,10 @@ minetest.register_node('tasks:printing_press_off',{ collision_box = box, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, drop = 'tasks:printing_press_on', - on_receive_fields = function(pos, formname, fields, sender) - if fields ['gimme'] then - local player_inv = sender:get_inventory() - if not player_inv:contains_item('main', {name='tasks:paper_stack_req', count = 1}) then - player_inv:add_item('main', 'tasks:paper_stack_req') - else - minetest.chat_send_player(sender:get_player_name(), 'You have too many of these already.') - end - end + req_form = 'tasks:paper_stack_req', + req_count = 1, + on_rightclick = function(pos, node, clicker) + tasks.right_click_off(pos, node, clicker, formspec_bad(pos)) end, allow_metadata_inventory_put = function(pos, listname, index, stack) if listname == 'part' then @@ -92,7 +86,7 @@ minetest.register_node('tasks:printing_press_off',{ local infotext = string.sub(meta:get_string('infotext'), 1, -16) inv:set_stack('part', 1, '') minetest.swap_node(pos, {name = 'tasks:printing_press_on', param2 = node.param2}) - meta:set_string('formspec', formspec_good) + minetest.close_formspec(name, 'tasks:part_req_form') meta:set_string('infotext', infotext) tasks.only_add_xp(xp, name) timer:start(random_number) diff --git a/mods/tasks/radio_dish.lua b/mods/tasks/radio_dish.lua index 424be14..91fdf75 100644 --- a/mods/tasks/radio_dish.lua +++ b/mods/tasks/radio_dish.lua @@ -2,16 +2,20 @@ local formspec_good = 'size[6,3]'.. 'textarea[1,1;5,2;;;Signal strength 97%]' -local formspec_bad = -'formspec_version[3]'.. - 'size[10.5,7]'.. - 'textarea[.5,.5;5,1;;;No Signal!\nNew Low-noise block required!]' .. - 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. - 'list[current_name;part;8,1.5;1,1;]'.. - 'list[current_player;main;.5,3;8,3;]'.. - 'listring[current_player;main]'.. - 'listring[current_name;part]'.. - 'image[8,1.5;1,1;tasks_lnb_line.png]' +local function formspec_bad(pos) + local spos = pos.x ..','.. pos.y ..','.. pos.z + local formspec = + 'formspec_version[3]'.. + 'size[10.5,7]'.. + 'textarea[.5,.5;5,1;;;No Signal!\nNew Low-noise block required!]' .. + 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. + 'list[nodemeta:'..spos..';part;8,1.5;1,1;]'.. + 'list[current_player;main;.5,3;8,3;]'.. + 'listring[current_player;main]'.. + 'listring[nodemeta:'..spos..';part]'.. + 'image[8,1.5;1,1;tasks_lnb_line.png]' + return formspec +end local box = { type = 'fixed', @@ -29,20 +33,15 @@ minetest.register_node('tasks:radio_dish_on',{ collision_box = box, groups = {breakable = 1, tasks=1}, on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string('formspec', formspec_good) - meta:set_string('infotext', 'Satellite Dish') - meta:set_int('time_min', 300) - meta:set_int('time_max', 600) - meta:set_int('xp', 10) - tasks.on_construct(pos) + tasks.on_construct(pos, 'Satellite Dish') + end, + on_rightclick = function(pos, node, clicker) + tasks.right_click_on(pos, node, clicker, formspec_good) end, - on_rightclick = tasks.right_click, on_timer = function(pos) local node = minetest.get_node(pos) local meta = minetest.get_meta(pos) local infotext = meta:get_string('infotext') - meta:set_string('formspec', formspec_bad) meta:set_string('infotext', infotext..' (Needs repair!)') minetest.swap_node(pos, {name = 'tasks:radio_dish_off', param2 = node.param2}) end, @@ -59,15 +58,10 @@ minetest.register_node('tasks:radio_dish_off',{ collision_box = box, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, drop = 'tasks:radio_dish_on', - on_receive_fields = function(pos, formname, fields, sender) - if fields ['gimme'] then - local player_inv = sender:get_inventory() - if not player_inv:contains_item('main', {name='tasks:lnb_req', count = 4}) then - player_inv:add_item('main', 'tasks:lnb_req') - else - minetest.chat_send_player(sender:get_player_name(), 'You have too many of these already.') - end - end + req_form = 'tasks:lnb_req', + req_count = 4, + on_rightclick = function(pos, node, clicker) + tasks.right_click_off(pos, node, clicker, formspec_bad(pos)) end, allow_metadata_inventory_put = function(pos, listname, index, stack) if listname == 'part' then @@ -91,7 +85,7 @@ minetest.register_node('tasks:radio_dish_off',{ local infotext = string.sub(meta:get_string('infotext'), 1, -17) inv:set_stack('part', 1, '') minetest.swap_node(pos, {name = 'tasks:radio_dish_on', param2 = node.param2}) - meta:set_string('formspec', formspec_good) + minetest.close_formspec(name, 'tasks:part_req_form') meta:set_string('infotext', infotext) tasks.only_add_xp(xp, name) timer:start(random_number) diff --git a/mods/tasks/smoke_detector.lua b/mods/tasks/smoke_detector.lua index e12bf3a..fe0615b 100644 --- a/mods/tasks/smoke_detector.lua +++ b/mods/tasks/smoke_detector.lua @@ -2,16 +2,20 @@ local formspec_good = 'size[6,3]'.. 'textarea[1,1;5,2;;;Battery voltage is in the acceptable range.]' -local formspec_bad = -'formspec_version[3]'.. - 'size[10.5,7]'.. - 'textarea[.5,.5;5,1;;;Battery is low, please replace.]' .. - 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. - 'list[current_name;part;8,1.5;1,1;]'.. - 'list[current_player;main;.5,3;8,3;]'.. - 'listring[current_player;main]'.. - 'listring[current_name;part]'.. - 'image[8,1.5;1,1;tasks_9v_battery_line.png]' +local function formspec_bad(pos) + local spos = pos.x ..','.. pos.y ..','.. pos.z + local formspec = + 'formspec_version[3]'.. + 'size[10.5,7]'.. + 'textarea[.5,.5;5,1;;;Battery is low, please replace.]' .. + 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. + 'list[nodemeta:'..spos..';part;8,1.5;1,1;]'.. + 'list[current_player;main;.5,3;8,3;]'.. + 'listring[current_player;main]'.. + 'listring[nodemeta:'..spos..';part]'.. + 'image[8,1.5;1,1;tasks_9v_battery_line.png]' + return formspec +end local box = { type = 'fixed', @@ -29,19 +33,15 @@ minetest.register_node('tasks:smoke_detector_on',{ collision_box = box, groups = {breakable = 1, tasks=1}, on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string('formspec', formspec_good) - meta:set_string('infotext', 'Smoke Detector') - meta:set_int('time_min', 300) - meta:set_int('time_max', 600) - tasks.on_construct(pos) + tasks.on_construct(pos, 'Smoke Detector') + end, + on_rightclick = function(pos, node, clicker) + tasks.right_click_on(pos, node, clicker, formspec_good) end, - on_rightclick = tasks.right_click, on_timer = function(pos) local node = minetest.get_node(pos) local meta = minetest.get_meta(pos) local infotext = meta:get_string('infotext') - meta:set_string('formspec', formspec_bad) meta:set_string('infotext', infotext..' (Needs repair!)') minetest.swap_node(pos, {name = 'tasks:smoke_detector_off', param2 = node.param2}) minetest.sound_play('tasks_smoke_alarm_chirp', {pos = pos, gain = 2, max_hear_distance = 14}) @@ -59,15 +59,10 @@ minetest.register_node('tasks:smoke_detector_off',{ groups = {breakable = 1, not_in_creative_inventory=1, tasks=1, plays_sound=1}, _sound = 'tasks_smoke_alarm_chirp', drop = 'tasks:smoke_detector_on', - on_receive_fields = function(pos, formname, fields, sender) - if fields ['gimme'] then - local player_inv = sender:get_inventory() - if not player_inv:contains_item('main', {name='tasks:9v_battery_req', count = 4}) then - player_inv:add_item('main', 'tasks:9v_battery_req') - else - minetest.chat_send_player(sender:get_player_name(), 'You have too many of these already.') - end - end + req_form = 'tasks:9v_battery_req', + req_count = 4, + on_rightclick = function(pos, node, clicker) + tasks.right_click_off(pos, node, clicker, formspec_bad(pos)) end, allow_metadata_inventory_put = function(pos, listname, index, stack) if listname == 'part' then @@ -91,7 +86,7 @@ minetest.register_node('tasks:smoke_detector_off',{ local infotext = string.sub(meta:get_string('infotext'), 1, -17) inv:set_stack('part', 1, '') minetest.swap_node(pos, {name = 'tasks:smoke_detector_on'}) - meta:set_string('formspec', formspec_good) + minetest.close_formspec(name, 'tasks:part_req_form') meta:set_string('infotext', infotext) tasks.only_add_xp(xp, name) timer:start(random_number) diff --git a/mods/tasks/transformer.lua b/mods/tasks/transformer.lua index 7a0d9f3..1a09a02 100644 --- a/mods/tasks/transformer.lua +++ b/mods/tasks/transformer.lua @@ -8,14 +8,18 @@ local formspec_good = 'size[6,3]'.. 'textarea[1,1;5,2;;;Everything is functioning properly]' -local formspec_bad = - 'size[8,6]'.. - 'textarea[.5,;5,2;;;There must have been a power surge.\nGet a new part from a storage locker.]' .. - 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. - 'list[current_name;part;6,1;1,1;]'.. - 'list[current_player;main;0,3;8,3;]'.. - 'listring[current_player;main]'.. - 'listring[current_name;part]' +local function formspec_bad(pos) + local spos = pos.x ..','.. pos.y ..','.. pos.z + local formspec = + 'size[8,6]'.. + 'textarea[.5,;5,2;;;There must have been a power surge.\nGet a new part from a storage locker.]' .. + 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. + 'list[nodemeta:'..spos..';part;6,1;1,1;]'.. + 'list[current_player;main;0,3;8,3;]'.. + 'listring[current_player;main]'.. + 'listring[nodemeta:'..spos..';part]' + return formspec +end minetest.register_node('tasks:transformer_0_on',{ description = 'Power Transformer', @@ -27,18 +31,16 @@ minetest.register_node('tasks:transformer_0_on',{ collision_box = col_box, groups = {breakable = 1, tasks=1}, on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string('formspec', formspec_good) - meta:set_string('infotext', 'Power transformer') - tasks.on_construct(pos) + tasks.on_construct(pos, 'Power Transformer') + end, + on_rightclick = function(pos, node, clicker) + tasks.right_click_on(pos, node, clicker, formspec_good) end, - on_rightclick = tasks.right_click, on_timer = function(pos) local node = minetest.get_node(pos) local meta = minetest.get_meta(pos) local infotext = meta:get_string('infotext') minetest.swap_node(pos, {name = 'tasks:transformer_0_off', param2 = node.param2}) - meta:set_string('formspec', formspec_bad) meta:set_string('infotext', infotext..' (Needs repair!)') end, }) @@ -53,15 +55,10 @@ minetest.register_node('tasks:transformer_0_off',{ collision_box = col_box, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, drop = 'tasks:transformer_0_on', - on_receive_fields = function(pos, formname, fields, sender) - if fields ['gimme'] then - local player_inv = sender:get_inventory() - if not player_inv:contains_item('main', {name='tasks:fuse_req', count = 4}) then - player_inv:add_item('main', 'tasks:fuse_req') - else - minetest.chat_send_player(sender:get_player_name(), 'You have too many of these already.') - end - end + req_form = 'tasks:fuse_req', + req_count = 4, + on_rightclick = function(pos, node, clicker) + tasks.right_click_off(pos, node, clicker, formspec_bad(pos)) end, allow_metadata_inventory_put = function(pos, listname, index, stack) if listname == 'part' then @@ -85,7 +82,7 @@ minetest.register_node('tasks:transformer_0_off',{ local infotext = string.sub(meta:get_string('infotext'), 1, -17) inv:set_stack('part', 1, '') minetest.swap_node(pos, {name = 'tasks:transformer_0_on', param2 = node.param2}) - meta:set_string('formspec', formspec_good) + minetest.close_formspec(name, 'tasks:part_req_form') meta:set_string('infotext', infotext) tasks.only_add_xp(xp, name) timer:start(random_number)