]> git.lizzy.rs Git - blockshuffle.git/blob - init.lua
Create README.md
[blockshuffle.git] / init.lua
1 blockshuffle = {}
2 blockshuffle.gameid = nil
3 blockshuffle.interval = 60 * 10
4 blockshuffle.players = {}
5 blockshuffle.player_data = {}
6 blockshuffle.skip_data = {}
7 blockshuffle.nodes = {}
8 blockshuffle.turns = 0
9 blockshuffle.hud_elements = {}
10
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)
15                 end
16         end
17 end)
18
19 function blockshuffle.loop()
20         if not blockshuffle.gameid and #minetest.get_connected_players() > 1 then
21                 blockshuffle.game_start()
22         end
23         minetest.after(10, blockshuffle.loop)
24 end
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()
31                 end
32         end
33 end
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
38                 blockshuffle.expire()
39         if #blockshuffle.players <= 1 then
40                         blockshuffle.game_end()
41                 else
42                         minetest.after(blockshuffle.interval, function() blockshuffle.turn(gameid, blockshuffle.turns) end)
43                 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)
53             end
54                 end
55         end     
56 end
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])))
62         else
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, ", "))))
64         end
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)
71         end
72     end
73         blockshuffle.gameid = nil
74         blockshuffle.player_data = {}
75         blockshuffle.players = {}
76 end
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()
82         end
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)
86 end
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)
91 end
92 function blockshuffle.turn_end()
93     minetest.chat_send_all(minetest.colorize("#FEFF42", "Ended turn!"))
94         blockshuffle.turn(blockshuffle.gameid, blockshuffle.turns)
95 end
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 .. "."))
101                 end
102         end
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)
108     end
109 end
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()
116                 end
117         end
118 })
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()
125                 end
126         end
127 })
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()
134                 end
135         end
136 })
137 minetest.register_chatcommand("disqualify",{
138         privs = {server = true},
139         param = "<player>",
140         func = function(name, param)
141                 blockshuffle.loose(param, "they were disqualified")
142         if #blockshuffle.players <= 1 then
143             blockshuffle.game_end()
144         end
145         end
146 })
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!"))
155                     return
156                 end
157             end
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()
162             end
163         else
164             minetest.chat_send_player(name, minetest.colorize("#FF0000", "There is no blockshuffle running!"))
165         end
166         end
167 })
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]
174         if element then
175             puncher:hud_change(element, "text", "You have to wait for the current turn to end")
176             puncher:hud_change(element, "number", 0xFEFF42)
177         end
178         end
179 end)
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()
185         end
186     for i, voted_name in pairs(blockshuffle.skip_data) do
187         if voted_name == name then
188             table.remove()
189         end
190     end
191     if #blockshuffle.skip_data > #minetest.get_connected_players() / 2 then
192         blockshuffle.turn_skip()
193     end
194 end)
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."))
199         else
200         minetest.chat_send_player(name, minetest.colorize("#FFF701", "You must wait for the next blockshuffle to start (Minimum 2 players needed)."))
201     end
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},
209         number    = 0xFFFFFF,
210     })
211 end)