2 blockshuffle.gameid = nil
3 blockshuffle.interval = 60 * 10
4 blockshuffle.players = {}
5 blockshuffle.player_data = {}
6 blockshuffle.skip_data = {}
7 blockshuffle.nodes = {}
9 blockshuffle.hud_elements = {}
11 minetest.register_on_mods_loaded(function()
12 for nodename, node in pairs(minetest.registered_nodes) do
13 if minetest.get_item_group(nodename, "not_in_creative_inventory") <= 0 then
14 blockshuffle.nodes[#blockshuffle.nodes + 1] = table.copy(node)
19 function blockshuffle.loop()
20 if not blockshuffle.gameid and #minetest.get_connected_players() > 1 then
21 blockshuffle.game_start()
23 minetest.after(10, blockshuffle.loop)
25 minetest.after(10, blockshuffle.loop)
26 function blockshuffle.expire()
27 for _, player in pairs(blockshuffle.players) do
28 if blockshuffle.player_data[player] then
29 blockshuffle.loose(player, "they did not find their block in time")
30 return blockshuffle.expire()
34 function blockshuffle.turn(gameid, turn)
35 blockshuffle.skip_data = {}
36 if blockshuffle.gameid == gameid and blockshuffle.turns == turn then
37 blockshuffle.turns = blockshuffle.turns + 1
39 if #blockshuffle.players <= 1 then
40 blockshuffle.game_end()
42 minetest.after(blockshuffle.interval, function() blockshuffle.turn(gameid, blockshuffle.turns) end)
44 for _, name in pairs(blockshuffle.players) do
45 local node = blockshuffle.nodes[math.random(#blockshuffle.nodes)]
46 blockshuffle.player_data[name] = node.name
47 minetest.chat_send_player(name, minetest.colorize("#01FFF3", "You must find and punch " .. node.description .. " [" .. node.name .. "]"))
48 local player = minetest.get_player_by_name(name)
49 local element = blockshuffle.hud_elements[name]
50 if player and element then
51 player:hud_change(element, "text", "You must find and punch " .. node.description .. " [" .. node.name .. "]")
52 player:hud_change(element, "number", 0x01FFF3)
57 function blockshuffle.game_end()
58 if #blockshuffle.players == 0 then
59 minetest.chat_send_all(minetest.colorize("#FEFF42", "The Blockshuffle " .. minetest.colorize("#01FFF3", blockshuffle.gameid) .. minetest.colorize("#FEFF42", " is over. There is no winner.")))
60 elseif #blockshuffle.players == 1 then
61 minetest.chat_send_all(minetest.colorize("#FEFF42", "The Blockshuffle " .. minetest.colorize("#01FFF3", blockshuffle.gameid) .. minetest.colorize("#FEFF42"," is over. Winner: " .. blockshuffle.players[1])))
63 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, ", "))))
65 for _, name in pairs(blockshuffle.players) do
66 local player = minetest.get_player_by_name(name)
67 local element = blockshuffle.hud_elements[name]
68 if player and element then
69 player:hud_change(element, "text", "You are currently in no blockshuffle")
70 player:hud_change(element, "number", 0xFFFFFF)
73 blockshuffle.gameid = nil
74 blockshuffle.player_data = {}
75 blockshuffle.players = {}
77 function blockshuffle.game_start()
78 blockshuffle.gameid = "#" .. tostring(math.random(10000))
79 local players = minetest.get_connected_players()
80 for k, v in pairs(players) do
81 blockshuffle.players[k] = v:get_player_name()
83 minetest.chat_send_all(minetest.colorize("#FEFF42", "The Blockshuffle " .. minetest.colorize("#01FFF3", blockshuffle.gameid) .. minetest.colorize("#FEFF42", " has started!")))
84 blockshuffle.turns = 0
85 blockshuffle.turn(blockshuffle.gameid, blockshuffle.turns)
87 function blockshuffle.turn_skip()
88 minetest.chat_send_all(minetest.colorize("#FEFF42", "Skipped turn!"))
89 blockshuffle.player_data = {}
90 blockshuffle.turn(blockshuffle.gameid, blockshuffle.turns)
92 function blockshuffle.turn_end()
93 minetest.chat_send_all(minetest.colorize("#FEFF42", "Ended turn!"))
94 blockshuffle.turn(blockshuffle.gameid, blockshuffle.turns)
96 function blockshuffle.loose(name, reason)
97 for i, player in pairs(blockshuffle.players) do
98 if player == name then
99 table.remove(blockshuffle.players, i)
100 minetest.chat_send_all(minetest.colorize("#FFB001", name .. " has lost the Blockshuffle because " .. reason .. "."))
103 local player = minetest.get_player_by_name(name)
104 local element = blockshuffle.hud_elements[name]
105 if player and element then
106 player:hud_change(element, "text", "You are currently in no blockshuffle")
107 player:hud_change(element, "number", 0xFFFFFF)
110 minetest.register_chatcommand("end_game",{
111 description = "End a blockshuffle game",
112 privs = {server = true},
113 func = function(name)
114 if blockshuffle.gameid then
115 blockshuffle.game_end()
119 minetest.register_chatcommand("skip_turn",{
120 description = "Skip current blockshuffle turn",
121 privs = {server = true},
122 func = function(name)
123 if blockshuffle.gameid then
124 blockshuffle.turn_skip()
128 minetest.register_chatcommand("end_turn",{
129 description = "End current blockshuffle turn",
130 privs = {server = true},
131 func = function(name)
132 if blockshuffle.gameid then
133 blockshuffle.turn_end()
137 minetest.register_chatcommand("disqualify",{
138 privs = {server = true},
140 func = function(name, param)
141 blockshuffle.loose(param, "they were disqualified")
142 if #blockshuffle.players <= 1 then
143 blockshuffle.game_end()
147 minetest.register_chatcommand("skip",{
148 description = "Vote for skipping current blockshuffle turn",
149 privs = {interact = true},
150 func = function(name)
151 if blockshuffle.gameid then
152 for _, voted_name in pairs(blockshuffle.skip_data) do
153 if name == voted_name then
154 minetest.chat_send_player(name, minetest.colorize("#FF0000", "You already have voted!"))
158 table.insert(blockshuffle.skip_data, name)
159 minetest.chat_send_all(minetest.colorize("#FEFF42", name .. " has voted to skip the turn."))
160 if #blockshuffle.skip_data > #minetest.get_connected_players() / 2 then
161 blockshuffle.turn_skip()
164 minetest.chat_send_player(name, minetest.colorize("#FF0000", "There is no blockshuffle running!"))
168 minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
169 local name = puncher:get_player_name()
170 if blockshuffle.gameid and blockshuffle.player_data[name] == node.name then
171 minetest.chat_send_all(minetest.colorize("#4FFF01", name .. " has found their block!"))
172 blockshuffle.player_data[name] = nil
173 local element = blockshuffle.hud_elements[name]
175 puncher:hud_change(element, "text", "You have to wait for the current turn to end")
176 puncher:hud_change(element, "number", 0xFEFF42)
180 minetest.register_on_leaveplayer(function(player)
181 local name = player:get_player_name()
182 blockshuffle.loose(name, "they left the game")
183 if #blockshuffle.players <= 1 then
184 blockshuffle.game_end()
186 for i, voted_name in pairs(blockshuffle.skip_data) do
187 if voted_name == name then
191 if #blockshuffle.skip_data > #minetest.get_connected_players() / 2 then
192 blockshuffle.turn_skip()
195 minetest.register_on_joinplayer(function(player)
196 local name = player:get_player_name()
197 if blockshuffle.gameid then
198 minetest.chat_send_player(name, minetest.colorize("#FFF701", "You must wait for the current blockshuffle to end."))
200 minetest.chat_send_player(name, minetest.colorize("#FFF701", "You must wait for the next blockshuffle to start (Minimum 2 players needed)."))
202 blockshuffle.hud_elements[name] = player:hud_add({
203 hud_elem_type = "text",
204 position = {x = 1, y = 0},
205 offset = {x = -5, y = 5},
206 text = "You are currently in no blockshuffle",
207 alignment = {x = -1, y = 1},
208 scale = {x = 100, y = 100},