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 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])

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

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
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

View File

@ -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')

View File

@ -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
})
]]

View File

@ -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'..

View File

@ -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)

View File

@ -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})

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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})

View File

@ -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)

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
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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)