Traitor/mods/sabotage/functions.lua

115 lines
4.9 KiB
Lua

minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == 'sabotage:traitor' then
local name = player:get_player_name()
local map_id = lobby.game[name]
local pos = sabotage.player_pos[name]
local meta = minetest.get_meta(pos)
if fields.sabotage then
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 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)
local node_name = node.name
local def = minetest.registered_nodes[node_name]
local desc = def.description
local flip = def.sabotage_switch
if flip then
minetest.swap_node(pos, {name = flip, param2 = node.param2})
end
meta:set_string('traitor', name)
meta:set_string('map_id', map_id)
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 name = player:get_player_name()
local map_id = lobby.game[name]
local pos = sabotage.player_pos[name]
local meta = minetest.get_meta(pos)
if fields.save then
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 1), 4)
meta:set_int('timer', timer)
meta:set_int('chance', chance)
meta:set_int('damage', damage)
meta:set_int('level', level)
meta:set_string('alert', alert)
end
elseif formname == 'sabotage:player' then
local name = player:get_player_name()
local map_id = lobby.game[name]
if fields.repair then
local pos = sabotage.player_pos[name]
local meta = minetest.get_meta(pos)
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)
local node_name = node.name
local def = minetest.registered_nodes[node_name]
local flip = def.sabotage_switch
if flip then
minetest.swap_node(pos, {name = flip, param2 = node.param2})
end
local time = meta:get_int('timer')
sabotage.clear_hud(map_id)
lobby.sabotage_level[map_id] = 5
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)