Updated tasks to use sabotage data.

master
Nathan Salapat 2022-06-05 21:29:05 -05:00
parent 40e5dfe52b
commit d11aef2922
22 changed files with 358 additions and 259 deletions

View File

@ -310,12 +310,15 @@ minetest.register_node('lobby:button_1', {
if player_count >= needed_players then if player_count >= needed_players then
if lobby.map[map_id] == 0 or lobby.map[map_id] == nil 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.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.map[map_id] = player_count
lobby.update_stats(map_id, 'player', '', player_count) lobby.update_stats(map_id, 'player', '', player_count)
local traitor = math.random(1, player_count) local traitor = math.random(1, player_count)
lobby.xp[map_id] = 0 lobby.xp[map_id] = 0
lobby.votes[map_id] = 0 lobby.votes[map_id] = 0
lobby.corpses[map_id] = {} lobby.corpses[map_id] = {}
lobby.sabotage[map_id] = false
lobby.sabotage_level[map_id] = 0
for i=1,player_count do for i=1,player_count do
minetest.chat_send_player(map_players[i], 'Hold tight, loading the level.') minetest.chat_send_player(map_players[i], 'Hold tight, loading the level.')
local player = minetest.get_player_by_name(map_players[i]) local player = minetest.get_player_by_name(map_players[i])

View File

@ -189,8 +189,10 @@ minetest.register_chatcommand('checkxp', {
local map_id = lobby.game[name] local map_id = lobby.game[name]
if map_id ~= 'lobby' then if map_id ~= 'lobby' then
local xp = lobby.xp[map_id] local xp = lobby.xp[map_id]
local game_data = lobby.savedata.data[map_id]
local required_xp = game_data['xp']
if xp then 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 else
minetest.chat_send_player(name, 'Welp, no XP here?') minetest.chat_send_player(name, 'Welp, no XP here?')
end end

View File

@ -10,6 +10,8 @@ lobby.corpses = {}
lobby.vote_timer = {} lobby.vote_timer = {}
lobby.spawn_pos = {x=29996, y=-4.5, z=30041.5} 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.spawn_pos = minetest.setting_get_pos('traitor_lobby_spawn') or lobby.spawn_pos
lobby.sabotage = {}
lobby.sabotage_level = {}
lobby.stat = {} lobby.stat = {}
--Yes I know these table names are not very clear. --Yes I know these table names are not very clear.

View File

@ -95,6 +95,7 @@ minetest.register_on_respawnplayer(function(player)
local player_attributes = player:get_meta() local player_attributes = player:get_meta()
local pos = minetest.string_to_pos(player_attributes:get_string('spawn_pos')) local pos = minetest.string_to_pos(player_attributes:get_string('spawn_pos'))
local map_id = lobby.game[name] local map_id = lobby.game[name]
minetest.log('action', name..' just respawned on '..map_id)
local mode = player_attributes:get_string('mode') local mode = player_attributes:get_string('mode')
player:set_armor_groups({immortal=1}) player:set_armor_groups({immortal=1})
minetest.chat_send_player(name, 'You are immortal for 10 seconds.') 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.') minetest.chat_send_player(name, 'Immortallity has ended.')
end) end)
if map_id ~= 'lobby' and mode == 'ghost' then 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) player:set_pos(pos)
return true return true
else else

View File

@ -1,6 +1,6 @@
function sabotage.traitor_formspec(pos) function sabotage.traitor_formspec(pos)
local meta = minetest.get_meta(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 chance = meta:get_int('chance') or 1
local damage = meta:get_int('damage') or 1 local damage = meta:get_int('damage') or 1
local formspec = local formspec =
@ -9,8 +9,8 @@ function sabotage.traitor_formspec(pos)
'textarea[.5,.5;9,6;;;Sabotage the crew, and risk life and limb. '.. '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 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. '.. '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 the Failure Timer is greater than 30 you will win or loose depending on if the crew \'repairs\' the node.'..
'if they are successful they win the round, otherwise you win!'.. '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]'.. '\n\nRisk Factor: '..chance..'/10 \nPotential Health Impact: '..damage..' \nFailure Timer: '..timer..' seconds]'..
'button_exit[3.5,7;3,.75;sabotage;Do It]' 'button_exit[3.5,7;3,.75;sabotage;Do It]'
return formspec return formspec
@ -22,20 +22,26 @@ function sabotage.builder_formspec(pos)
local chance = meta:get_int('chance') or 1 local chance = meta:get_int('chance') or 1
local damage = meta:get_int('damage') or 1 local damage = meta:get_int('damage') or 1
local alert = meta:get_string('alert') or '' local alert = meta:get_string('alert') or ''
local level = meta:get_int('level') or 0
local formspec = local formspec =
'formspec_version[3]'.. 'formspec_version[3]'..
'size[16,9]'.. 'size[16,9]'..
'textarea[1,1;14,4;;;Sabotaging is a risky business, the traitor can fail and take damage. '.. '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.)'.. '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.'.. '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 before the traitor wins the level. Must be over 30 seconds.\n'.. 'Timer is the amount of time the crew is given to \'repair\' the sabotaged node. Must be over 30 seconds. '..
'Alert text will be sent to all players on the level, \n'.. 'Set below 30 seconds to not use a timer. Effect will last until crew repairs it.\n'..
'and should include something to let them know where/what was sabotaged and needs to be fixed. \n'.. 'Alert text will be sent to all players on the level, '..
'This will be a chat message. The node description will also be included in the HUD display.]'.. '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..']'.. 'textarea[1,5;14,1;alert;Alert Text:;'..alert..']'..
'field[1,6.5;2.5,.75;chance;Chance:;'..chance..']'.. 'field[1,6.5;2.5,.75;chance;Chance:;'..chance..']'..
'field[6.75,6.5;2.5,.75;damage;Damage:;'..damage..']'.. '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]' 'button_exit[6.5,7.5;3,1;save;Save]'
return formspec return formspec
end end

View File

@ -1,49 +1,67 @@
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
local name = player:get_player_name() local name = player:get_player_name()
local map_id = lobby.game[name]
if formname == 'sabotage:traitor' then if formname == 'sabotage:traitor' then
local pos = sabotage.player_pos[name] local pos = sabotage.player_pos[name]
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if fields.sabotage then if fields.sabotage then
local chance = meta:get_int('chance') or 1 local sabotaged = lobby.sabotage[map_id]
local damage = meta:get_int('damage') or 1 if sabotaged == true then
local player_attributes = player:get_meta() minetest.chat_send_player(name, 'Sorry you can only sabotage one item at a time currently.')
local luck = player_attributes:get_int('luck') else
if math.random(10) + luck >= chance then local chance = meta:get_int('chance') or 1
local hurt = math.random(damage) local damage = meta:get_int('damage') or 1
local health = player:get_hp() local level = meta:get_int('level') or 0
local new_health = health - hurt local player_attributes = player:get_meta()
player:set_hp(new_health) local luck = player_attributes:get_int('luck')
end if math.random(10) + luck >= chance then
if math.random(10) + luck >= chance then local hurt = math.random(damage)
local node = minetest.get_node(pos).name local health = player:get_hp()
local def = minetest.registered_nodes[node] local new_health = health - hurt
local desc = def.description player:set_hp(new_health)
local map_id = lobby.game[name] end
meta:set_string('traitor', name) if math.random(10) + luck >= chance then
meta:set_string('map_id', map_id) local node = minetest.get_node(pos).name
meta:set_string('sabotaged', 'true') local def = minetest.registered_nodes[node]
local time = meta:get_int('timer') local desc = def.description
local timer = minetest.get_node_timer(pos) meta:set_string('traitor', name)
local alert = meta:get_string('alert') meta:set_string('map_id', map_id)
timer:start(time) meta:set_string('sabotaged', 'true')
lobby.message_to_level(map_id, 'Warning!!! Level has been sabotaged. Proceed with caution!!!') lobby.sabotage[map_id] = true
lobby.message_to_level(map_id, alert) local time = meta:get_int('timer')
minetest.chat_send_player(name, 'You dirty dog, you just doomed the lives of all other players.') if time > 29 then
sabotage.show_hud(map_id, time, desc) local timer = minetest.get_node_timer(pos)
sabotage.timer[map_id] = time 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
end end
elseif formname == 'sabotage:builder' then elseif formname == 'sabotage:builder' then
local pos = sabotage.player_pos[name] local pos = sabotage.player_pos[name]
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if fields.save then if fields.save then
local timer = math.max((tonumber(fields.timer) or 30), 30) local timer = tonumber(fields.timer_input) or 0
local chance = math.min((fields.chance or 2), 10) if timer < 30 then
local damage = fields.damage or 1 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 alert = fields.alert or ''
local level = math.min((tonumber(fields.level) or 0), 4)
meta:set_int('timer', timer) meta:set_int('timer', timer)
meta:set_int('chance', chance) meta:set_int('chance', chance)
meta:set_int('damage', damage) meta:set_int('damage', damage)
meta:set_int('level', level)
meta:set_string('sabotaged', 'false') meta:set_string('sabotaged', 'false')
meta:set_string('alert', alert) meta:set_string('alert', alert)
end end
@ -62,12 +80,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
player:set_hp(new_health) player:set_hp(new_health)
end end
if math.random(10) + luck >= chance then if math.random(10) + luck >= chance then
local map_id = lobby.game[name] local time = meta:get_int('timer')
local timer = minetest.get_node_timer(pos)
sabotage.clear_hud(map_id) sabotage.clear_hud(map_id)
meta:set_string('sabotaged', 'false') meta:set_string('sabotaged', 'false')
timer:stop() lobby.sabotage_level[map_id] = 0
lobby.team_win(map_id) 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 end
end end

View File

@ -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 for _, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name() local name = player:get_player_name()
if lobby.game[name] == map_id then if lobby.game[name] == map_id then
@ -40,15 +40,18 @@ function sabotage.clear_hud(map_id)
local name = player:get_player_name() local name = player:get_player_name()
if lobby.game[name] == map_id then if lobby.game[name] == map_id then
local idx = sabotage.hud[name] local idx = sabotage.hud[name]
player:hud_remove(idx.title) for key,value in pairs(idx) do
player:hud_remove(idx.timer) player:hud_remove(value)
player:hud_remove(idx.desc) end
end end
end end
end end
function sabotage.update_hud(map_id) function sabotage.update_hud(map_id)
local time = sabotage.timer[map_id] - 1 local time = sabotage.timer[map_id] - 1
if time < 0 then
return
end
sabotage.timer[map_id] = time sabotage.timer[map_id] = time
for _, player in pairs(minetest.get_connected_players()) do for _, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name() local name = player:get_player_name()
@ -57,9 +60,33 @@ function sabotage.update_hud(map_id)
player:hud_change(idx.timer, 'text', time..' seconds') player:hud_change(idx.timer, 'text', time..' seconds')
end end
end end
if time > 0 then minetest.after(1, function()
minetest.after(1, function() sabotage.update_hud(map_id)
sabotage.update_hud(map_id) end)
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
end end

View File

@ -2,6 +2,7 @@ sabotage = {}
sabotage.player_pos = {} sabotage.player_pos = {}
sabotage.hud = {} sabotage.hud = {}
sabotage.timer = {} sabotage.timer = {}
sabotage.level = {}
dofile(minetest.get_modpath('sabotage')..'/formspecs.lua') dofile(minetest.get_modpath('sabotage')..'/formspecs.lua')
dofile(minetest.get_modpath('sabotage')..'/functions.lua') dofile(minetest.get_modpath('sabotage')..'/functions.lua')

View File

@ -1,8 +1,7 @@
--[[minetest.register_node('sabotage:test', { minetest.register_node('sabotage:test', {
description = 'Sabotage Testing', description = 'Sabotage Testing',
tiles = {'sabotage_test.png'}, 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_rightclick = sabotage.on_rightclick,
on_timer = sabotage.on_timer on_timer = sabotage.on_timer
}) })
]]

View File

@ -17,7 +17,8 @@ sfinv.register_page('sfinv:help', {
local mode = player_attributes:get_string('mode') local mode = player_attributes:get_string('mode')
if not creative.is_enabled_for(player:get_player_name()) then if not creative.is_enabled_for(player:get_player_name()) then
return sfinv.make_formspec(player, context, 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. '.. '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. '.. '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'.. 'Visit the shop to buy upgrades, privileges, and at some point cosmetics!\n\n'..
@ -25,7 +26,8 @@ sfinv.register_page('sfinv:help', {
, true) , true)
else else
return sfinv.make_formspec(player, context, 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. '.. '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.) '.. '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'.. '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'..

View File

@ -77,6 +77,7 @@ minetest.register_node('tasks:campfire_1', {
meta:set_int('time_min', 240) meta:set_int('time_min', 240)
meta:set_int('time_max', 600) meta:set_int('time_max', 600)
meta:set_int('xp', 1) meta:set_int('xp', 1)
meta:set_int('level', 0)
end, end,
on_rightclick = tasks.right_click, on_rightclick = tasks.right_click,
on_timer = function(pos) on_timer = function(pos)

View File

@ -31,8 +31,21 @@ minetest.register_node('tasks:code_0', {
light_source = 14, light_source = 14,
selection_box = box, selection_box = box,
collision_box = box, collision_box = box,
on_construct = tasks.on_contruct, on_construct = function(pos)
on_rightclick = tasks.right_click, 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) on_timer = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
minetest.swap_node(pos, {name = 'tasks:code_1', param2 = node.param2}) minetest.swap_node(pos, {name = 'tasks:code_1', param2 = node.param2})

View File

@ -14,6 +14,8 @@ minetest.register_tool('tasks:configurator', {
doors.lock(pos, name) doors.lock(pos, name)
elseif minetest.get_item_group(node.name, 'stash') > 0 then elseif minetest.get_item_group(node.name, 'stash') > 0 then
tasks.stash(pos, name) tasks.stash(pos, name)
elseif minetest.get_item_group(node.name, 'sabotage') > 0 then
sabotage.on_punch(pos, node, user)
end end
end end
end end
@ -27,7 +29,8 @@ function tasks.configure(pos, name)
local time_min = meta:get_int('time_min') or 60 local time_min = meta:get_int('time_min') or 60
local time_max = meta:get_int('time_max') or 120 local time_max = meta:get_int('time_max') or 120
local xp = meta:get_int('xp') or 5 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 end
minetest.register_on_player_receive_fields(function(player, formname, fields) 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 formname == 'tasks:configuration' then
if fields.save 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) 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 pos = tasks.player_config[name]
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
meta:set_int('time_min', math.max(fields.time_min,5)) 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('time_max', math.max(fields.time_max,20))
meta:set_int('xp', fields.xp) meta:set_int('xp', fields.xp)
meta:set_int('level', math.min(fields.level, 4))
meta:set_string('infotext', fields.infotext) meta:set_string('infotext', fields.infotext)
local random_number = math.random(fields.time_min, fields.time_max) local random_number = math.random(fields.time_min, fields.time_max)
timer:start(random_number) timer:start(random_number)
@ -52,18 +56,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
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 = local formspec =
'formspec_version[3]'.. 'formspec_version[3]'..
'size[8,6]'.. '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. '.. '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'.. '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,3;6,.5;infotext;Infotext;'..infotext..']'..
'field[1,4;2,.5;time_min;Minimum time;'..time_min..']'.. 'field[1,4;2,.5;time_min;Minimum time;'..time_min..']'..
'field[5,4;2,.5;time_max;Maximum time;'..time_max..']'.. 'field[5,4;2,.5;time_max;Maximum time;'..time_max..']'..
'field[1,5;2,.5;xp;XP;'..xp..']'.. 'field[1,5;1.5,.5;xp;XP;'..xp..']'..
'button_exit[5,5;2,.5;save;Submit]' 'field[3.25,5;1.5,.5;level;Level;'..level..']'..
'button_exit[5.5,5;1.5,.5;save;Submit]'
return formspec return formspec
end end

View File

@ -2,14 +2,18 @@ local formspec_good =
'size[6,3]'.. 'size[6,3]'..
'textarea[1,1;5,2;;;This reactor is performing at peak efficiency.]' 'textarea[1,1;5,2;;;This reactor is performing at peak efficiency.]'
local formspec_bad = local function formspec_bad(pos)
'size[8,6]'.. local spos = pos.x ..','.. pos.y ..','.. pos.z
'textarea[.5,;5,2;;;Looks like something is broke.\nGet a new part from a storage locker.]' .. local formspec =
'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. 'size[8,6]'..
'list[current_name;part;6,1;1,1;]'.. 'textarea[.5,;5,2;;;Looks like something is broke.\nGet a new part from a storage locker.]' ..
'list[current_player;main;0,3;8,3;]'.. 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'..
'listring[current_player;main]'.. 'list[nodemeta:'..spos..';part;6,1;1,1;]'..
'listring[current_name;part]' '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',{ minetest.register_node('tasks:engine_0_on',{
description = 'Arc Reactor', description = 'Arc Reactor',
@ -29,18 +33,16 @@ minetest.register_node('tasks:engine_0_on',{
groups = {breakable = 1, tasks=1, plays_sound=1}, groups = {breakable = 1, tasks=1, plays_sound=1},
_sound = 'tasks_engine_0_run', _sound = 'tasks_engine_0_run',
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) tasks.on_construct(pos, 'Arc Reactor')
meta:set_string('formspec', formspec_good) end,
meta:set_string('infotext', 'Arc Reactor') on_rightclick = function(pos, node, clicker)
tasks.on_construct(pos) tasks.right_click_on(pos, node, clicker, formspec_good)
end, end,
on_rightclick = tasks.right_click,
on_timer = function(pos) on_timer = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local infotext = meta:get_string('infotext') local infotext = meta:get_string('infotext')
minetest.sound_play('tasks_engine_0_stop', {pos = pos, gain = 1, max_hear_distance = 10}) 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!)') meta:set_string('infotext', infotext..' (Needs repair!)')
minetest.after(11, function() minetest.after(11, function()
minetest.swap_node(pos, {name = 'tasks:engine_0_off', param2 = node.param2}) 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, light_source = 2,
groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1},
drop = 'tasks:engine_0_on', drop = 'tasks:engine_0_on',
on_receive_fields = function(pos, formname, fields, sender) req_form = 'tasks:gear_req',
if fields ['gimme'] then req_count = 4,
local player_inv = sender:get_inventory() on_rightclick = function(pos, node, clicker)
if not player_inv:contains_item('main', {name='tasks:gear_req', count = 4}) then tasks.right_click_off(pos, node, clicker, formspec_bad(pos))
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
end, end,
allow_metadata_inventory_put = function(pos, listname, index, stack) allow_metadata_inventory_put = function(pos, listname, index, stack)
if listname == 'part' then if listname == 'part' then
@ -93,7 +90,7 @@ minetest.register_node('tasks:engine_0_off',{
inv:set_stack('part', 1, '') inv:set_stack('part', 1, '')
minetest.sound_play('tasks_engine_0_start', {pos = pos, gain = 1, max_hear_distance = 10}) 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}) 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) meta:set_string('infotext', infotext)
tasks.only_add_xp(xp, name) tasks.only_add_xp(xp, name)
timer:start(random_number) timer:start(random_number)

View File

@ -2,14 +2,18 @@ local formspec_good =
'size[6,3]'.. 'size[6,3]'..
'textarea[1,1;5,2;;;This plasma accelerator is performing at peak efficiency.]' 'textarea[1,1;5,2;;;This plasma accelerator is performing at peak efficiency.]'
local formspec_bad = local function formspec_bad(pos)
'size[8,6]'.. local spos = pos.x ..','.. pos.y ..','.. pos.z
'textarea[.5,;5,2;;;Looks like something is broke.\nGet a new part from a storage locker.]' .. local formspec =
'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. 'size[8,6]'..
'list[current_name;part;6,1;1,1;]'.. 'textarea[.5,;5,2;;;Looks like something is broke.\nGet a new part from a storage locker.]' ..
'list[current_player;main;0,3;8,3;]'.. 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'..
'listring[current_player;main]'.. 'list[nodemeta:'..spos..';part;6,1;1,1;]'..
'listring[current_name;part]' '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',{ minetest.register_node('tasks:engine_1_on',{
description = 'Plasma Accelerator', description = 'Plasma Accelerator',
@ -28,18 +32,16 @@ minetest.register_node('tasks:engine_1_on',{
_sound = 'tasks_engine_1_run', _sound = 'tasks_engine_1_run',
groups = {breakable = 1, tasks=1, plays_sound=1}, groups = {breakable = 1, tasks=1, plays_sound=1},
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) tasks.on_construct(pos, 'Plasma Accelerator')
meta:set_string('formspec', formspec_good) end,
meta:set_string('infotext', 'Plasma Accelerator') on_rightclick = function(pos, node, clicker)
tasks.on_construct(pos) tasks.right_click_on(pos, node, clicker, formspec_good)
end, end,
on_rightclick = tasks.right_click,
on_timer = function(pos) on_timer = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local infotext = meta:get_string('infotext') local infotext = meta:get_string('infotext')
minetest.sound_play('tasks_engine_1_stop', {pos = pos, gain = 1, max_hear_distance = 5}) 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!)') meta:set_string('infotext', infotext..' (Needs repair!)')
minetest.after(5, function() minetest.after(5, function()
minetest.swap_node(pos, {name = 'tasks:engine_1_off', param2 = node.param2}) 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, light_source = 2,
groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1},
drop = 'tasks:engine_1_on', drop = 'tasks:engine_1_on',
on_receive_fields = function(pos, formname, fields, sender) req_form = 'tasks:plasma_core_req',
if fields ['gimme'] then req_count = 4,
local player_inv = sender:get_inventory() on_rightclick = function(pos, node, clicker)
if not player_inv:contains_item('main', {name='tasks:plasma_core_req', count = 4}) then tasks.right_click_off(pos, node, clicker, formspec_bad(pos))
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
end, end,
allow_metadata_inventory_put = function(pos, listname, index, stack) allow_metadata_inventory_put = function(pos, listname, index, stack)
if listname == 'part' then if listname == 'part' then
@ -91,7 +88,7 @@ minetest.register_node('tasks:engine_1_off',{
inv:set_stack('part', 1, '') inv:set_stack('part', 1, '')
minetest.sound_play('tasks_engine_1_start', {pos = pos, gain = 1, max_hear_distance = 10}) 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}) 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) meta:set_string('infotext', infotext)
tasks.only_add_xp(xp, name) tasks.only_add_xp(xp, name)
timer:start(random_number) timer:start(random_number)

View File

@ -5,7 +5,9 @@ minetest.register_node('tasks:example_0', { --This node is inactive, so somebody
tiles = {name='task_1.png'}, tiles = {name='task_1.png'},
groups = {breakable=1, not_in_creative_inventory=1, tasks=1}, groups = {breakable=1, not_in_creative_inventory=1, tasks=1},
light_source = 14, light_source = 14,
on_construct = tasks.on_construct, on_construct = function(pos)
tasks.on_construct(pos, 'infotext')
end,
on_timer = function(pos) on_timer = function(pos)
local this_node = minetest.get_node(pos) local this_node = minetest.get_node(pos)
minetest.swap_node(pos, {name = 'tasks:example_1', param2 = this_node.param2}) minetest.swap_node(pos, {name = 'tasks:example_1', param2 = this_node.param2})

View File

@ -2,16 +2,20 @@ local formspec_good =
'size[6,3]'.. 'size[6,3]'..
'textarea[1,1;5,2;;;Working Fine.]' 'textarea[1,1;5,2;;;Working Fine.]'
local formspec_bad = local function formspec_bad(pos)
'formspec_version[3]'.. local spos = pos.x ..','.. pos.y ..','.. pos.z
'size[10.5,7]'.. local formspec =
'textarea[.5,.5;5,1;;;Shields down!!!\nNew Quantum Coil Needed ASAP.]' .. 'formspec_version[3]'..
'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. 'size[10.5,7]'..
'list[current_name;part;8,1.5;1,1;]'.. 'textarea[.5,.5;5,1;;;Shields down!!!\nNew Quantum Coil Needed ASAP.]' ..
'list[current_player;main;.5,3;8,3;]'.. 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'..
'listring[current_player;main]'.. 'list[nodemeta:'..spos..';part;8,1.5;1,1;]'..
'listring[current_name;part]'.. 'list[current_player;main;.5,3;8,3;]'..
'image[8,1.5;1,1;tasks_quantum_coil_line.png]' '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 = { local on_box = {
type = 'fixed', type = 'fixed',
@ -36,23 +40,17 @@ minetest.register_node('tasks:forcefield_gen_on',{
collision_box = on_box, collision_box = on_box,
groups = {breakable = 1, tasks=1}, groups = {breakable = 1, tasks=1},
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) tasks.on_construct(pos, 'Forcefield Generator')
meta:set_string('formspec', formspec_good) end,
meta:set_string('infotext', 'Forcefield Generator') on_rightclick = function(pos, node, clicker)
meta:set_int('time_min', 300) tasks.right_click_on(pos, node, clicker, formspec_good)
meta:set_int('time_max', 600)
meta:set_int('xp', 10)
tasks.on_construct(pos)
end, end,
on_rightclick = tasks.right_click,
on_timer = function(pos) on_timer = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local infotext = meta:get_string('infotext') local infotext = meta:get_string('infotext')
meta:set_string('formspec', formspec_bad)
meta:set_string('infotext', infotext..' (Needs repair!)') meta:set_string('infotext', infotext..' (Needs repair!)')
minetest.swap_node(pos, {name = 'tasks:forcefield_gen_off', param2 = node.param2}) 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, end,
}) })
@ -67,15 +65,10 @@ minetest.register_node('tasks:forcefield_gen_off',{
collision_box = off_box, collision_box = off_box,
groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1},
drop = 'tasks:forcefield_gen_on', drop = 'tasks:forcefield_gen_on',
on_receive_fields = function(pos, formname, fields, sender) req_form = 'tasks:quantum_coil_req',
if fields ['gimme'] then req_count = 2,
local player_inv = sender:get_inventory() on_rightclick = function(pos, node, clicker)
if not player_inv:contains_item('main', {name='tasks:quantum_coil_req', count = 2}) then tasks.right_click_off(pos, node, clicker, formspec_bad(pos))
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
end, end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player) allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if listname == 'part' then 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) local infotext = string.sub(meta:get_string('infotext'), 1, -17)
inv:set_stack('part', 1, '') inv:set_stack('part', 1, '')
minetest.swap_node(pos, {name = 'tasks:forcefield_gen_on', param2 = node.param2}) 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) meta:set_string('infotext', infotext)
tasks.only_add_xp(xp, name) tasks.only_add_xp(xp, name)
timer:start(random_number) timer:start(random_number)

View File

@ -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 lobby.xp[map_id] = lobby.xp[map_id] + earned_xp
local needed_xp = game_data['xp'] - lobby.xp[map_id] 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.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) tasks.check_xp(map_id, needed_xp)
else else
lobby.give_xp(puncher, 1) 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 lobby.xp[map_id] = lobby.xp[map_id] + xp
local needed_xp = game_data['xp'] - lobby.xp[map_id] 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.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) tasks.check_xp(map_id, needed_xp)
else else
lobby.give_xp(player, 1) 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
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 timer = minetest.get_node_timer(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local min = meta:get_int('time_min') or 30 local min = meta:get_int('time_min') or 30
local max = meta:get_int('time_max') or 60 local max = meta:get_int('time_max') or 60
local random_number = math.random(min,max) local random_number = math.random(min,max)
timer:start(random_number) timer:start(random_number)
minetest.show_formspec(clicker:get_player_name(), 'tasks:good', formspec)
meta:set_string('formspec', '')
end 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 meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size('part', 1) inv:set_size('part', 1)
meta:set_string('infotext', infotext)
meta:set_int('time_min', 30) meta:set_int('time_min', 30)
meta:set_int('time_max', 90) meta:set_int('time_max', 90)
meta:set_int('xp', 5) meta:set_int('xp', 5)
meta:set_int('level', 0)
end end
function tasks.is_integer(input) function tasks.is_integer(input)
@ -110,3 +130,22 @@ function tasks.valid_input(string)
return true return true
end end
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)

View File

@ -2,16 +2,20 @@ local formspec_good =
'size[6,3]'.. 'size[6,3]'..
'textarea[1,1;5,2;;;Paper stock OK.]' 'textarea[1,1;5,2;;;Paper stock OK.]'
local formspec_bad = local function formspec_bad(pos)
'formspec_version[3]'.. local spos = pos.x ..','.. pos.y ..','.. pos.z
'size[10.5,7]'.. local formspec =
'textarea[.5,.5;5,1;;;No paper!\nPrinting halted!]' .. 'formspec_version[3]'..
'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. 'size[10.5,7]'..
'list[current_name;part;8,1.5;1,1;]'.. 'textarea[.5,.5;5,1;;;No paper!\nPrinting halted!]' ..
'list[current_player;main;.5,3;8,3;]'.. 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'..
'listring[current_player;main]'.. 'list[nodemeta:'..spos..';part;8,1.5;1,1;]'..
'listring[current_name;part]'.. 'list[current_player;main;.5,3;8,3;]'..
'image[8,1.5;1,1;tasks_paper_stack_line.png]' 'listring[current_player;main]'..
'listring[nodemeta:'..spos..';part]'..
'image[8,1.5;1,1;tasks_paper_stack_line.png]'
return formspec
end
local box = { local box = {
type = 'fixed', type = 'fixed',
@ -30,20 +34,15 @@ minetest.register_node('tasks:printing_press_on',{
collision_box = box, collision_box = box,
groups = {breakable = 1, tasks=1}, groups = {breakable = 1, tasks=1},
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) tasks.on_construct(pos, 'Printing Press')
meta:set_string('formspec', formspec_good) end,
meta:set_string('infotext', 'Printing Press') on_rightclick = function(pos, node, clicker)
meta:set_int('time_min', 300) tasks.right_click_on(pos, node, clicker, formspec_good)
meta:set_int('time_max', 600)
meta:set_int('xp', 10)
tasks.on_construct(pos)
end, end,
on_rightclick = tasks.right_click,
on_timer = function(pos) on_timer = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local infotext = meta:get_string('infotext') local infotext = meta:get_string('infotext')
meta:set_string('formspec', formspec_bad)
meta:set_string('infotext', infotext..' (Needs paper!)') meta:set_string('infotext', infotext..' (Needs paper!)')
minetest.swap_node(pos, {name = 'tasks:printing_press_off', param2 = node.param2}) minetest.swap_node(pos, {name = 'tasks:printing_press_off', param2 = node.param2})
end, end,
@ -60,15 +59,10 @@ minetest.register_node('tasks:printing_press_off',{
collision_box = box, collision_box = box,
groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1},
drop = 'tasks:printing_press_on', drop = 'tasks:printing_press_on',
on_receive_fields = function(pos, formname, fields, sender) req_form = 'tasks:paper_stack_req',
if fields ['gimme'] then req_count = 1,
local player_inv = sender:get_inventory() on_rightclick = function(pos, node, clicker)
if not player_inv:contains_item('main', {name='tasks:paper_stack_req', count = 1}) then tasks.right_click_off(pos, node, clicker, formspec_bad(pos))
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
end, end,
allow_metadata_inventory_put = function(pos, listname, index, stack) allow_metadata_inventory_put = function(pos, listname, index, stack)
if listname == 'part' then 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) local infotext = string.sub(meta:get_string('infotext'), 1, -16)
inv:set_stack('part', 1, '') inv:set_stack('part', 1, '')
minetest.swap_node(pos, {name = 'tasks:printing_press_on', param2 = node.param2}) 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) meta:set_string('infotext', infotext)
tasks.only_add_xp(xp, name) tasks.only_add_xp(xp, name)
timer:start(random_number) timer:start(random_number)

View File

@ -2,16 +2,20 @@ local formspec_good =
'size[6,3]'.. 'size[6,3]'..
'textarea[1,1;5,2;;;Signal strength 97%]' 'textarea[1,1;5,2;;;Signal strength 97%]'
local formspec_bad = local function formspec_bad(pos)
'formspec_version[3]'.. local spos = pos.x ..','.. pos.y ..','.. pos.z
'size[10.5,7]'.. local formspec =
'textarea[.5,.5;5,1;;;No Signal!\nNew Low-noise block required!]' .. 'formspec_version[3]'..
'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. 'size[10.5,7]'..
'list[current_name;part;8,1.5;1,1;]'.. 'textarea[.5,.5;5,1;;;No Signal!\nNew Low-noise block required!]' ..
'list[current_player;main;.5,3;8,3;]'.. 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'..
'listring[current_player;main]'.. 'list[nodemeta:'..spos..';part;8,1.5;1,1;]'..
'listring[current_name;part]'.. 'list[current_player;main;.5,3;8,3;]'..
'image[8,1.5;1,1;tasks_lnb_line.png]' 'listring[current_player;main]'..
'listring[nodemeta:'..spos..';part]'..
'image[8,1.5;1,1;tasks_lnb_line.png]'
return formspec
end
local box = { local box = {
type = 'fixed', type = 'fixed',
@ -29,20 +33,15 @@ minetest.register_node('tasks:radio_dish_on',{
collision_box = box, collision_box = box,
groups = {breakable = 1, tasks=1}, groups = {breakable = 1, tasks=1},
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) tasks.on_construct(pos, 'Satellite Dish')
meta:set_string('formspec', formspec_good) end,
meta:set_string('infotext', 'Satellite Dish') on_rightclick = function(pos, node, clicker)
meta:set_int('time_min', 300) tasks.right_click_on(pos, node, clicker, formspec_good)
meta:set_int('time_max', 600)
meta:set_int('xp', 10)
tasks.on_construct(pos)
end, end,
on_rightclick = tasks.right_click,
on_timer = function(pos) on_timer = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local infotext = meta:get_string('infotext') local infotext = meta:get_string('infotext')
meta:set_string('formspec', formspec_bad)
meta:set_string('infotext', infotext..' (Needs repair!)') meta:set_string('infotext', infotext..' (Needs repair!)')
minetest.swap_node(pos, {name = 'tasks:radio_dish_off', param2 = node.param2}) minetest.swap_node(pos, {name = 'tasks:radio_dish_off', param2 = node.param2})
end, end,
@ -59,15 +58,10 @@ minetest.register_node('tasks:radio_dish_off',{
collision_box = box, collision_box = box,
groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1},
drop = 'tasks:radio_dish_on', drop = 'tasks:radio_dish_on',
on_receive_fields = function(pos, formname, fields, sender) req_form = 'tasks:lnb_req',
if fields ['gimme'] then req_count = 4,
local player_inv = sender:get_inventory() on_rightclick = function(pos, node, clicker)
if not player_inv:contains_item('main', {name='tasks:lnb_req', count = 4}) then tasks.right_click_off(pos, node, clicker, formspec_bad(pos))
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
end, end,
allow_metadata_inventory_put = function(pos, listname, index, stack) allow_metadata_inventory_put = function(pos, listname, index, stack)
if listname == 'part' then 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) local infotext = string.sub(meta:get_string('infotext'), 1, -17)
inv:set_stack('part', 1, '') inv:set_stack('part', 1, '')
minetest.swap_node(pos, {name = 'tasks:radio_dish_on', param2 = node.param2}) 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) meta:set_string('infotext', infotext)
tasks.only_add_xp(xp, name) tasks.only_add_xp(xp, name)
timer:start(random_number) timer:start(random_number)

View File

@ -2,16 +2,20 @@ local formspec_good =
'size[6,3]'.. 'size[6,3]'..
'textarea[1,1;5,2;;;Battery voltage is in the acceptable range.]' 'textarea[1,1;5,2;;;Battery voltage is in the acceptable range.]'
local formspec_bad = local function formspec_bad(pos)
'formspec_version[3]'.. local spos = pos.x ..','.. pos.y ..','.. pos.z
'size[10.5,7]'.. local formspec =
'textarea[.5,.5;5,1;;;Battery is low, please replace.]' .. 'formspec_version[3]'..
'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'.. 'size[10.5,7]'..
'list[current_name;part;8,1.5;1,1;]'.. 'textarea[.5,.5;5,1;;;Battery is low, please replace.]' ..
'list[current_player;main;.5,3;8,3;]'.. 'button_exit[3.5,1.5;3,1;gimme;Grab a part request form]'..
'listring[current_player;main]'.. 'list[nodemeta:'..spos..';part;8,1.5;1,1;]'..
'listring[current_name;part]'.. 'list[current_player;main;.5,3;8,3;]'..
'image[8,1.5;1,1;tasks_9v_battery_line.png]' 'listring[current_player;main]'..
'listring[nodemeta:'..spos..';part]'..
'image[8,1.5;1,1;tasks_9v_battery_line.png]'
return formspec
end
local box = { local box = {
type = 'fixed', type = 'fixed',
@ -29,19 +33,15 @@ minetest.register_node('tasks:smoke_detector_on',{
collision_box = box, collision_box = box,
groups = {breakable = 1, tasks=1}, groups = {breakable = 1, tasks=1},
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) tasks.on_construct(pos, 'Smoke Detector')
meta:set_string('formspec', formspec_good) end,
meta:set_string('infotext', 'Smoke Detector') on_rightclick = function(pos, node, clicker)
meta:set_int('time_min', 300) tasks.right_click_on(pos, node, clicker, formspec_good)
meta:set_int('time_max', 600)
tasks.on_construct(pos)
end, end,
on_rightclick = tasks.right_click,
on_timer = function(pos) on_timer = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local infotext = meta:get_string('infotext') local infotext = meta:get_string('infotext')
meta:set_string('formspec', formspec_bad)
meta:set_string('infotext', infotext..' (Needs repair!)') meta:set_string('infotext', infotext..' (Needs repair!)')
minetest.swap_node(pos, {name = 'tasks:smoke_detector_off', param2 = node.param2}) 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}) 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}, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1, plays_sound=1},
_sound = 'tasks_smoke_alarm_chirp', _sound = 'tasks_smoke_alarm_chirp',
drop = 'tasks:smoke_detector_on', drop = 'tasks:smoke_detector_on',
on_receive_fields = function(pos, formname, fields, sender) req_form = 'tasks:9v_battery_req',
if fields ['gimme'] then req_count = 4,
local player_inv = sender:get_inventory() on_rightclick = function(pos, node, clicker)
if not player_inv:contains_item('main', {name='tasks:9v_battery_req', count = 4}) then tasks.right_click_off(pos, node, clicker, formspec_bad(pos))
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
end, end,
allow_metadata_inventory_put = function(pos, listname, index, stack) allow_metadata_inventory_put = function(pos, listname, index, stack)
if listname == 'part' then 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) local infotext = string.sub(meta:get_string('infotext'), 1, -17)
inv:set_stack('part', 1, '') inv:set_stack('part', 1, '')
minetest.swap_node(pos, {name = 'tasks:smoke_detector_on'}) 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) meta:set_string('infotext', infotext)
tasks.only_add_xp(xp, name) tasks.only_add_xp(xp, name)
timer:start(random_number) timer:start(random_number)

View File

@ -8,14 +8,18 @@ local formspec_good =
'size[6,3]'.. 'size[6,3]'..
'textarea[1,1;5,2;;;Everything is functioning properly]' 'textarea[1,1;5,2;;;Everything is functioning properly]'
local formspec_bad = local function formspec_bad(pos)
'size[8,6]'.. local spos = pos.x ..','.. pos.y ..','.. pos.z
'textarea[.5,;5,2;;;There must have been a power surge.\nGet a new part from a storage locker.]' .. local formspec =
'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'.. 'size[8,6]'..
'list[current_name;part;6,1;1,1;]'.. 'textarea[.5,;5,2;;;There must have been a power surge.\nGet a new part from a storage locker.]' ..
'list[current_player;main;0,3;8,3;]'.. 'button_exit[2.5,1.5;3,1;gimme;Grab a part request form]'..
'listring[current_player;main]'.. 'list[nodemeta:'..spos..';part;6,1;1,1;]'..
'listring[current_name;part]' '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',{ minetest.register_node('tasks:transformer_0_on',{
description = 'Power Transformer', description = 'Power Transformer',
@ -27,18 +31,16 @@ minetest.register_node('tasks:transformer_0_on',{
collision_box = col_box, collision_box = col_box,
groups = {breakable = 1, tasks=1}, groups = {breakable = 1, tasks=1},
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) tasks.on_construct(pos, 'Power Transformer')
meta:set_string('formspec', formspec_good) end,
meta:set_string('infotext', 'Power transformer') on_rightclick = function(pos, node, clicker)
tasks.on_construct(pos) tasks.right_click_on(pos, node, clicker, formspec_good)
end, end,
on_rightclick = tasks.right_click,
on_timer = function(pos) on_timer = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local infotext = meta:get_string('infotext') local infotext = meta:get_string('infotext')
minetest.swap_node(pos, {name = 'tasks:transformer_0_off', param2 = node.param2}) 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!)') meta:set_string('infotext', infotext..' (Needs repair!)')
end, end,
}) })
@ -53,15 +55,10 @@ minetest.register_node('tasks:transformer_0_off',{
collision_box = col_box, collision_box = col_box,
groups = {breakable = 1, not_in_creative_inventory=1, tasks=1}, groups = {breakable = 1, not_in_creative_inventory=1, tasks=1},
drop = 'tasks:transformer_0_on', drop = 'tasks:transformer_0_on',
on_receive_fields = function(pos, formname, fields, sender) req_form = 'tasks:fuse_req',
if fields ['gimme'] then req_count = 4,
local player_inv = sender:get_inventory() on_rightclick = function(pos, node, clicker)
if not player_inv:contains_item('main', {name='tasks:fuse_req', count = 4}) then tasks.right_click_off(pos, node, clicker, formspec_bad(pos))
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
end, end,
allow_metadata_inventory_put = function(pos, listname, index, stack) allow_metadata_inventory_put = function(pos, listname, index, stack)
if listname == 'part' then 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) local infotext = string.sub(meta:get_string('infotext'), 1, -17)
inv:set_stack('part', 1, '') inv:set_stack('part', 1, '')
minetest.swap_node(pos, {name = 'tasks:transformer_0_on', param2 = node.param2}) 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) meta:set_string('infotext', infotext)
tasks.only_add_xp(xp, name) tasks.only_add_xp(xp, name)
timer:start(random_number) timer:start(random_number)