writing concours

This commit is contained in:
crabman77 2015-06-28 03:01:16 +02:00
parent 957aaa91f5
commit fa4df8187d
3 changed files with 110 additions and 83 deletions

188
functions.lua Executable file → Normal file
View File

@ -57,16 +57,7 @@ function fishing_setting.func.set_settings(new_settings, settings)
if settings["escape_chance"] ~= nil then if settings["escape_chance"] ~= nil then
new_settings["escape_chance"] = settings["escape_chance"] new_settings["escape_chance"] = settings["escape_chance"]
end end
if settings["concours"] ~= nil then
new_settings["concours"] = settings["concours"]
end
if settings["duration"] ~= nil then
new_settings["duration"] = settings["duration"]
end
end end
@ -295,7 +286,7 @@ function fishing_setting.func.load_trophies()
if file then if file then
fishing_setting.trophies = minetest.deserialize(file:read("*all")) fishing_setting.trophies = minetest.deserialize(file:read("*all"))
file:close() file:close()
if fishing_setting.trophies and type(fishing_setting.trophies) ~= "table" then if not fishing_setting.trophies or type(fishing_setting.trophies) ~= "table" then
fishing_setting.trophies = {} fishing_setting.trophies = {}
end end
end end
@ -314,27 +305,29 @@ end
minetest.register_on_shutdown(function() minetest.register_on_shutdown(function()
minetest.log("action", "[fishing] Server shuts down. saving trophies table") minetest.log("action", "[fishing] Server shuts down. saving trophies table")
fishing_setting.func.save_trophies() fishing_setting.func.save_trophies()
--if fishing_setting.settings["concours"] == true then fishing_setting.func.save_concours()
fishing_setting.func.save_concours()
--end
end) end)
--[[
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
local playername = player:get_player_name() local playername = player:get_player_name()
if fishing_setting.trophies[playername] == nil then -- if fishing_setting.trophies[fish][playername] == nil then
fishing_setting.trophies[playername] = { ["fish_raw"] = 0,["shark_raw"] = 0, ["pike_raw"] = 0, ["clownfish_raw"]= 0, ["bluefish_raw"] = 0 } -- fishing_setting.trophies[fish][playername] = { ["fish_raw"] = 0,["shark_raw"] = 0, ["pike_raw"] = 0, ["clownfish_raw"]= 0, ["bluefish_raw"] = 0 }
end -- end
end) end)
--]]
function fishing_setting.func.add_to_trophies(player, fish, desc) function fishing_setting.func.add_to_trophies(player, fish, desc)
local player_name = player:get_player_name() local player_name = player:get_player_name()
if not player_name then return end if not player_name then return end
if fish == "fish_raw" or fish == "shark_raw" or fish == "pike_raw" or fish == "clownfish_raw" or fish == "bluefish_raw" then if fish == "fish_raw" or fish == "shark_raw" or fish == "pike_raw" or fish == "clownfish_raw" or fish == "bluefish_raw" then
fishing_setting.trophies[player_name][fish] = fishing_setting.trophies[player_name][fish] + 1 if fishing_setting.trophies[fish] == nil then
fishing_setting.trophies[fish] = {}
if fishing_setting.trophies[player_name][fish]%100 == 0 then end
minetest.chat_send_player(player_name, fishing_setting.func.S("You win a new trophie, you have catched %s " .. fish.."."):format(fishing_setting.trophies[player_name][fish])) fishing_setting.trophies[fish][player_name] = (fishing_setting.trophies[fish][player_name] or 0) + 1
if fishing_setting.trophies[fish][player_name]%100 == 0 then
minetest.chat_send_player(player_name, fishing_setting.func.S("You win a new trophie, you have catched %s " .. fish.."."):format(fishing_setting.trophies[fish][player_name]))
local inv = player:get_inventory() local inv = player:get_inventory()
local name = "fishing:trophy_"..fish local name = "fishing:trophy_"..fish
if inv:room_for_item("main", {name=name, count=1, wear=0, metadata=""}) then if inv:room_for_item("main", {name=name, count=1, wear=0, metadata=""}) then
@ -344,15 +337,11 @@ function fishing_setting.func.add_to_trophies(player, fish, desc)
end end
end end
if fishing_setting.settings["concours"] == true then if fishing_setting.concours["concours"] ~= nil and fishing_setting.concours["concours"] == true then
if fishing_setting.concours[fish] == nil then if fishing_setting.concours[fish] == nil then
fishing_setting.concours[fish] = {} fishing_setting.concours[fish] = {}
end end
if fishing_setting.concours[fish][player_name] == nil then fishing_setting.concours[fish][player_name] = (fishing_setting.concours[fish][player_name] or 0) + 1
fishing_setting.concours[fish][player_name] = 1
else
fishing_setting.concours[fish][player_name] = fishing_setting.concours[fish][player_name] + 1
end
minetest.chat_send_all(fishing_setting.func.S("Yeah, %s catch "..desc):format(player_name)) minetest.chat_send_all(fishing_setting.func.S("Yeah, %s catch "..desc):format(player_name))
end end
end end
@ -408,12 +397,12 @@ end
function fishing_setting.func.load_concours() function fishing_setting.func.load_concours()
local file = io.open(fishing_setting.file_concours, "r") local file = io.open(fishing_setting.file_concours, "r")
local settings = {} local settings = {}
fishing_setting.concours = {} fishing_setting.concours = {["concours"] = false, ["duration"] = 3600}
if file then if file then
fishing_setting.concours= minetest.deserialize(file:read("*all")) fishing_setting.concours= minetest.deserialize(file:read("*all"))
file:close() file:close()
if settings == nil or type(settings) ~= "table" then if settings == nil or type(settings) ~= "table" then
fishing_setting.concours = {} fishing_setting.concours = {["concours"] = false, ["duration"] = 3600}
end end
end end
end end
@ -425,23 +414,23 @@ end
fishing_setting.func.on_show_settings_concours = function(player_name) fishing_setting.func.on_show_settings_concours = function(player_name)
if not fishing_setting.tmp_setting then if not fishing_setting.tmp_setting then
fishing_setting.tmp_setting = {} fishing_setting.tmp_setting = {["concours"] = (fishing_setting.concours["concours"] or false), ["duration"] = 3600, ["reset"] = ""}
fishing_setting.func.set_settings(fishing_setting.tmp_setting, fishing_setting.settings)
end end
local formspec = "size[6,6]bgcolor[#99a8ba;]label[2,0;FISHING CONCOURS]".. local formspec = "size[6,6]bgcolor[#99a8ba;]label[1.8,0;FISHING CONCOURS]"..
--Time concours --Time concours
"label[1.6,0.5;Duration]".. "label[2,0.5;Duration]"..
"button[0,1;1,1;duration;-60]".. "button[1,1;1,1;duration;-60]"..
"button[1,1;1,1;duration;-600]".. "button[2,1;1,1;duration;-600]"..
"label[2.1,1.2;"..tostring(fishing_setting.tmp_setting["duration"]).."]".. "label[2.9,1.2;"..tostring(fishing_setting.tmp_setting["duration"]).."]"..
"button[2.7,1;1,1;duration;+600]".. "button[3.7,1;1,1;duration;+600]"..
"button[3.7,1;1,1;duration;+60]".. "button[4.7,1;1,1;duration;+60]"..
--concours enable --concours enable
"label[0.5,2.5;concours enable]".. "label[1,2.5;concours enable]"..
"button[3.5,2.3;1,1;concours;"..tostring(fishing_setting.tmp_setting["concours"]).."]".. "button[4.7,2.3;1,1;concours;"..tostring(fishing_setting.tmp_setting["concours"]).."]"..
"label[0.5,4.8;reset classements]".. --reset
"field[3,5;1,1;reset;;]".. "label[1,3.3;reset classements(type 'yes')]"..
"field[5,3.5;1,1;reset;;]"..
"button_exit[0.5,5.2;1.5,1;save;Abort]".. "button_exit[0.5,5.2;1.5,1;save;Abort]"..
@ -450,17 +439,43 @@ fishing_setting.func.on_show_settings_concours = function(player_name)
minetest.show_formspec(player_name, "fishing:concours", formspec) minetest.show_formspec(player_name, "fishing:concours", formspec)
end end
local function timetostr(time)
--TODO transform time in H:M:S str
return time
end
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname == "fishing:concours" then if formname == "fishing:concours" then
local name = player:get_player_name() local name = player:get_player_name()
if not name then return end if not name then return end
if fields["save"] == "Ok" then if fields["save"] == "Ok" then
fishing_setting.func.set_settings(fishing_setting.settings, fishing_setting.tmp_setting) if fields["reset"] and fields["reset"]:lower() == "yes" then
fishing_setting.func.save() fishing_setting.concours["fish_raw"] = {}
fishing_setting.concours["clownfish_raw"] = {}
fishing_setting.concours["bluefish_raw"] = {}
fishing_setting.concours["shark_raw"] = {}
fishing_setting.concours["pike_raw"] = {}
end
local progress = (fishing_setting.concours["concours"] or false)
fishing_setting.concours["duration"] = fishing_setting.tmp_setting["duration"]
fishing_setting.concours["concours"] = fishing_setting.tmp_setting["concours"]
if progress == false and fishing_setting.tmp_setting["concours"] == true then
fishing_setting.concours["concours"] = true
fishing_setting.concours["warning_said"] = false
--TODO show time in H:M:S
local time = timetostr(fishing_setting.concours["duration"])
minetest.chat_send_all(fishing_setting.func.S("Attention, Fishing contest go(duration %s)!!!"):format(time))
--TODO play sound go contest
elseif progress == true and fishing_setting.tmp_setting["concours"] == false then
fishing_setting.concours["concours"] = false
end
fishing_setting.func.save_concours()
fishing_setting.tmp_setting = nil fishing_setting.tmp_setting = nil
return return
elseif fields["quit"] or fields["abort"] then elseif fields["quit"] or fields["abort"] then
@ -470,19 +485,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
fishing_setting.tmp_setting["duration"] = inc(fishing_setting.tmp_setting["duration"], fields["duration"], 120, 14400) fishing_setting.tmp_setting["duration"] = inc(fishing_setting.tmp_setting["duration"], fields["duration"], 120, 14400)
elseif fields["concours"] then elseif fields["concours"] then
fishing_setting.tmp_setting["concours"] = bool(fields["concours"]) fishing_setting.tmp_setting["concours"] = bool(fields["concours"])
elseif fields["reset"] and fields["reset"]:lower() == "yes" then
fishing_setting.concours = {}
fishing_setting.func.save_concours()
else else
return return
end end
fishing_setting.func.on_show_settings_concours(name) fishing_setting.func.on_show_settings_concours(name)
end end
end) end)
minetest.register_chatcommand("fishing_concours", { minetest.register_chatcommand("fishing_concours", {
params = "fishing_concours <true|false> <time-in-sec>", params = "fishing_concours <true|false> <time-in-sec>",
description = "enable|disable fishing concours (admin only)", description = "enable|disable fishing concours (admin only)",
@ -494,8 +504,6 @@ minetest.register_chatcommand("fishing_concours", {
}) })
function spairs(t, order) function spairs(t, order)
-- collect the keys -- collect the keys
local keys = {} local keys = {}
@ -525,7 +533,10 @@ function fishing_setting.func.set_winners(list)
-- this uses an custom sorting function ordering by score descending -- this uses an custom sorting function ordering by score descending
for k,v in spairs(list, function(t,a,b) return t[b] < t[a] end) do for k,v in spairs(list, function(t,a,b) return t[b] < t[a] end) do
table.insert(win, {[k]=v}) table.insert(win, {[k]=v})
end if #win >= 6 then
break
end
end
return win return win
end end
@ -537,30 +548,29 @@ end
function fishing_setting.func.get_stat() function fishing_setting.func.get_stat()
local winners= {} local winners= {}
for k,v in pairs(fishing_setting.concours) do for k,v in pairs(fishing_setting.concours) do
if fishing_setting.concours[k] ~= nil then if string.find(k, "_raw") ~= nil then
winners[k] = fishing_setting.func.set_winners(fishing_setting.concours[k]) if fishing_setting.concours[k] ~= nil then
else winners[k] = fishing_setting.func.set_winners(fishing_setting.concours[k])
winners[k] = {} else
winners[k] = {}
end
end end
end --bgcolor[#99a8ba;] end
local formspec = {"size[11,8]bgcolor[#99a8ba;]label[3.5,0;FISHING CONCOURS CLASSEMENT]"} local formspec = {"size[12,8]bgcolor[#99a8ba;]label[3.5,0;FISHING CONCOURS CLASSEMENT]"}
local X = 0 local X = 0
local Y local Y
for fish, fishers in pairs(winners) do
for fish,fishers in pairs(winners) do Y = 1.4
Y = 1.5 table.insert(formspec, "label["..(X+0.4)..",0.5;"..string.gsub(fish, "_raw", ""):upper().."]") --fish name
table.insert(formspec, "label["..(X+0.4)..",1;"..tostring(fish):upper().."]") --fish name
for _,s in ipairs(fishers) do for _,s in ipairs(fishers) do
for pl,nb in pairs(s) do for pl,nb in pairs(s) do
table.insert(formspec, "label["..(X) ..","..Y..";"..tostring(nb).."]") -- nb fish catched table.insert(formspec, "label["..(X) ..","..Y..";"..tostring(nb).."]") -- nb fish catched
table.insert(formspec, "label["..(X+0.4) ..","..Y..";"..tostring(pl).."]") -- playername table.insert(formspec, "label["..(X+0.5) ..","..Y..";"..tostring(pl).."]") -- playername
end end
Y = Y + 0.5 Y = Y + 0.4
end end
X = X + 2.2 X = X + 2.3
end end
return table.concat(formspec) return table.concat(formspec)
end end
@ -577,13 +587,33 @@ minetest.register_chatcommand("fishing_class", {
end end
}) })
local function show_result()
minetest.after(3, function()
print("debug1")
local formspec = fishing_setting.func.get_stat()
for _,player in pairs(minetest.get_connected_players()) do
local player_name = player:get_player_name()
if player_name ~= nil then
print("debug2")
minetest.show_formspec(player_name, "fishing:classement", formspec)
end
end
end)
end
minetest.register_globalstep(function(dtime)
if fishing_setting.concours["concours"] == true then
fishing_setting.concours["duration"] = fishing_setting.concours["duration"] - dtime
if fishing_setting.concours["duration"] < 30 and fishing_setting.concours["warning_said"] ~= true then
minetest.chat_send_all("WARNING, Fishing contest will finish in 30 seconds")
fishing_setting.concours["warning_said"] = true
end
if fishing_setting.concours["duration"] < 0 then
minetest.chat_send_all("End of fishing contest")
fishing_setting.concours["concours"] = false
show_result()
end
end
end)

3
init.lua Executable file → Normal file
View File

@ -54,8 +54,7 @@ fishing_setting.settings["shark_chance"] = SHARK_CHANCE
fishing_setting.settings["tresor_chance"] = TRESOR_CHANCE fishing_setting.settings["tresor_chance"] = TRESOR_CHANCE
fishing_setting.settings["tresor_enable"] = TRESOR_RANDOM_ENABLE fishing_setting.settings["tresor_enable"] = TRESOR_RANDOM_ENABLE
fishing_setting.settings["escape_chance"] = ESCAPE_CHANCE fishing_setting.settings["escape_chance"] = ESCAPE_CHANCE
fishing_setting.settings["concours"] = CONCOURS
fishing_setting.settings["duration"] = DURATION
-- load config file if exist in worldpath -- load config file if exist in worldpath
fishing_setting.func.load() fishing_setting.func.load()

2
settings.txt Executable file → Normal file
View File

@ -10,5 +10,3 @@ SHARK_CHANCE = 50
TRESOR_CHANCE = 5 TRESOR_CHANCE = 5
TRESOR_RANDOM_ENABLE = true TRESOR_RANDOM_ENABLE = true
ESCAPE_CHANCE = 5 ESCAPE_CHANCE = 5
CONCOURS = false
DURATION = 1800