From f2f947c31019d5fb9ae5f27f4e6aa5280925b243 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 28 Oct 2020 16:45:07 +0100 Subject: [PATCH] Initial Commit --- init.lua | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 init.lua diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..5c2427b --- /dev/null +++ b/init.lua @@ -0,0 +1,211 @@ +blockshuffle = {} +blockshuffle.gameid = nil +blockshuffle.interval = 60 * 10 +blockshuffle.players = {} +blockshuffle.player_data = {} +blockshuffle.skip_data = {} +blockshuffle.nodes = {} +blockshuffle.turns = 0 +blockshuffle.hud_elements = {} + +minetest.register_on_mods_loaded(function() + for nodename, node in pairs(minetest.registered_nodes) do + if minetest.get_item_group(nodename, "not_in_creative_inventory") <= 0 then + blockshuffle.nodes[#blockshuffle.nodes + 1] = table.copy(node) + end + end +end) + +function blockshuffle.loop() + if not blockshuffle.gameid and #minetest.get_connected_players() > 1 then + blockshuffle.game_start() + end + minetest.after(10, blockshuffle.loop) +end +minetest.after(10, blockshuffle.loop) +function blockshuffle.expire() + for _, player in pairs(blockshuffle.players) do + if blockshuffle.player_data[player] then + blockshuffle.loose(player, "they did not find their block in time") + return blockshuffle.expire() + end + end +end +function blockshuffle.turn(gameid, turn) + blockshuffle.skip_data = {} + if blockshuffle.gameid == gameid and blockshuffle.turns == turn then + blockshuffle.turns = blockshuffle.turns + 1 + blockshuffle.expire() + if #blockshuffle.players <= 1 then + blockshuffle.game_end() + else + minetest.after(blockshuffle.interval, function() blockshuffle.turn(gameid, blockshuffle.turns) end) + end + for _, name in pairs(blockshuffle.players) do + local node = blockshuffle.nodes[math.random(#blockshuffle.nodes)] + blockshuffle.player_data[name] = node.name + minetest.chat_send_player(name, minetest.colorize("#01FFF3", "You must find and punch " .. node.description .. " [" .. node.name .. "]")) + local player = minetest.get_player_by_name(name) + local element = blockshuffle.hud_elements[name] + if player and element then + player:hud_change(element, "text", "You must find and punch " .. node.description .. " [" .. node.name .. "]") + player:hud_change(element, "number", 0x01FFF3) + end + end + end +end +function blockshuffle.game_end() + if #blockshuffle.players == 0 then + minetest.chat_send_all(minetest.colorize("#FEFF42", "The Blockshuffle " .. minetest.colorize("#01FFF3", blockshuffle.gameid) .. minetest.colorize("#FEFF42", " is over. There is no winner."))) + elseif #blockshuffle.players == 1 then + minetest.chat_send_all(minetest.colorize("#FEFF42", "The Blockshuffle " .. minetest.colorize("#01FFF3", blockshuffle.gameid) .. minetest.colorize("#FEFF42"," is over. Winner: " .. blockshuffle.players[1]))) + else + minetest.chat_send_all(minetest.colorize("#FEFF42", "The Blockshuffle " .. minetest.colorize("#01FFF3", blockshuffle.gameid) .. minetest.colorize("#FEFF42"," is over. Remaining Players: " .. table.concat(blockshuffle.players, ", ")))) + end + for _, name in pairs(blockshuffle.players) do + local player = minetest.get_player_by_name(name) + local element = blockshuffle.hud_elements[name] + if player and element then + player:hud_change(element, "text", "You are currently in no blockshuffle") + player:hud_change(element, "number", 0xFFFFFF) + end + end + blockshuffle.gameid = nil + blockshuffle.player_data = {} + blockshuffle.players = {} +end +function blockshuffle.game_start() + blockshuffle.gameid = "#" .. tostring(math.random(10000)) + local players = minetest.get_connected_players() + for k, v in pairs(players) do + blockshuffle.players[k] = v:get_player_name() + end + minetest.chat_send_all(minetest.colorize("#FEFF42", "The Blockshuffle " .. minetest.colorize("#01FFF3", blockshuffle.gameid) .. minetest.colorize("#FEFF42", " has started!"))) + blockshuffle.turns = 0 + blockshuffle.turn(blockshuffle.gameid, blockshuffle.turns) +end +function blockshuffle.turn_skip() + minetest.chat_send_all(minetest.colorize("#FEFF42", "Skipped turn!")) + blockshuffle.player_data = {} + blockshuffle.turn(blockshuffle.gameid, blockshuffle.turns) +end +function blockshuffle.turn_end() + minetest.chat_send_all(minetest.colorize("#FEFF42", "Ended turn!")) + blockshuffle.turn(blockshuffle.gameid, blockshuffle.turns) +end +function blockshuffle.loose(name, reason) + for i, player in pairs(blockshuffle.players) do + if player == name then + table.remove(blockshuffle.players, i) + minetest.chat_send_all(minetest.colorize("#FFB001", name .. " has lost the Blockshuffle because " .. reason .. ".")) + end + end + local player = minetest.get_player_by_name(name) + local element = blockshuffle.hud_elements[name] + if player and element then + player:hud_change(element, "text", "You are currently in no blockshuffle") + player:hud_change(element, "number", 0xFFFFFF) + end +end +minetest.register_chatcommand("end_game",{ + description = "End a blockshuffle game", + privs = {server = true}, + func = function(name) + if blockshuffle.gameid then + blockshuffle.game_end() + end + end +}) +minetest.register_chatcommand("skip_turn",{ + description = "Skip current blockshuffle turn", + privs = {server = true}, + func = function(name) + if blockshuffle.gameid then + blockshuffle.turn_skip() + end + end +}) +minetest.register_chatcommand("end_turn",{ + description = "End current blockshuffle turn", + privs = {server = true}, + func = function(name) + if blockshuffle.gameid then + blockshuffle.turn_end() + end + end +}) +minetest.register_chatcommand("disqualify",{ + privs = {server = true}, + param = "", + func = function(name, param) + blockshuffle.loose(param, "they were disqualified") + if #blockshuffle.players <= 1 then + blockshuffle.game_end() + end + end +}) +minetest.register_chatcommand("skip",{ + description = "Vote for skipping current blockshuffle turn", + privs = {interact = true}, + func = function(name) + if blockshuffle.gameid then + for _, voted_name in pairs(blockshuffle.skip_data) do + if name == voted_name then + minetest.chat_send_player(name, minetest.colorize("#FF0000", "You already have voted!")) + return + end + end + table.insert(blockshuffle.skip_data, name) + minetest.chat_send_all(minetest.colorize("#FEFF42", name .. " has voted to skip the turn.")) + if #blockshuffle.skip_data > #minetest.get_connected_players() / 2 then + blockshuffle.turn_skip() + end + else + minetest.chat_send_player(name, minetest.colorize("#FF0000", "There is no blockshuffle running!")) + end + end +}) +minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) + local name = puncher:get_player_name() + if blockshuffle.gameid and blockshuffle.player_data[name] == node.name then + minetest.chat_send_all(minetest.colorize("#4FFF01", name .. " has found their block!")) + blockshuffle.player_data[name] = nil + local element = blockshuffle.hud_elements[name] + if element then + puncher:hud_change(element, "text", "You have to wait for the current turn to end") + puncher:hud_change(element, "number", 0xFEFF42) + end + end +end) +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + blockshuffle.loose(name, "they left the game") + if #blockshuffle.players <= 1 then + blockshuffle.game_end() + end + for i, voted_name in pairs(blockshuffle.skip_data) do + if voted_name == name then + table.remove() + end + end + if #blockshuffle.skip_data > #minetest.get_connected_players() / 2 then + blockshuffle.turn_skip() + end +end) +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + if blockshuffle.gameid then + minetest.chat_send_player(name, minetest.colorize("#FFF701", "You must wait for the current blockshuffle to end.")) + else + minetest.chat_send_player(name, minetest.colorize("#FFF701", "You must wait for the next blockshuffle to start (Minimum 2 players needed).")) + end + blockshuffle.hud_elements[name] = player:hud_add({ + hud_elem_type = "text", + position = {x = 1, y = 0}, + offset = {x = -5, y = 5}, + text = "You are currently in no blockshuffle", + alignment = {x = -1, y = 1}, + scale = {x = 100, y = 100}, + number = 0xFFFFFF, + }) +end) -- 2.44.0