forked from mff/fishing
		
	start adding concours
This commit is contained in:
		
							
								
								
									
										224
									
								
								functions.lua
									
									
									
									
									
								
							
							
						
						
									
										224
									
								
								functions.lua
									
									
									
									
									
								
							@@ -59,6 +59,14 @@ function fishing_setting.func.set_settings(new_settings, settings)
 | 
			
		||||
		new_settings["escape_chance"] = settings["escape_chance"]
 | 
			
		||||
	end	
 | 
			
		||||
	
 | 
			
		||||
	if settings["concours"] ~= nil then
 | 
			
		||||
		new_settings["concours"] = settings["concours"]
 | 
			
		||||
	end
 | 
			
		||||
	if settings["duration"] ~= nil then
 | 
			
		||||
		new_settings["duration"] = settings["duration"]
 | 
			
		||||
	end	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -202,12 +210,16 @@ local inc = function(value, field, min, max)
 | 
			
		||||
		v = value + 10
 | 
			
		||||
	elseif field == "+60" then	
 | 
			
		||||
		v = value + 60
 | 
			
		||||
	elseif field == "+600" then
 | 
			
		||||
		v = value + 600
 | 
			
		||||
	elseif field == "-1" then	
 | 
			
		||||
		v = value - 1
 | 
			
		||||
	elseif field == "-10" then
 | 
			
		||||
		v = value - 10
 | 
			
		||||
	elseif field == "-60" then		
 | 
			
		||||
		v = value - 60
 | 
			
		||||
	elseif field == "-600" then		
 | 
			
		||||
		v = value - 600
 | 
			
		||||
	else -- useless, prevent crash
 | 
			
		||||
		return value
 | 
			
		||||
	end
 | 
			
		||||
@@ -302,6 +314,9 @@ end
 | 
			
		||||
minetest.register_on_shutdown(function()
 | 
			
		||||
	minetest.log("action", "[fishing] Server shuts down. saving trophies table")
 | 
			
		||||
	fishing_setting.func.save_trophies()
 | 
			
		||||
	--if fishing_setting.settings["concours"] == true then
 | 
			
		||||
		fishing_setting.func.save_concours()
 | 
			
		||||
	--end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
minetest.register_on_joinplayer(function(player)
 | 
			
		||||
@@ -328,6 +343,18 @@ function fishing_setting.func.add_to_trophies(player, fish, desc)
 | 
			
		||||
				minetest.spawn_item(player:getpos(), {name=name, count=1, wear=0, metadata=""})
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		
 | 
			
		||||
		if fishing_setting.settings["concours"] == true then
 | 
			
		||||
			if fishing_setting.concours[fish] == nil then
 | 
			
		||||
				fishing_setting.concours[fish] = {}
 | 
			
		||||
			end
 | 
			
		||||
			if fishing_setting.concours[fish][player_name] == nil then
 | 
			
		||||
				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))
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@@ -363,3 +390,200 @@ minetest.register_chatcommand("fishing_config", {
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
--function save settings 
 | 
			
		||||
function fishing_setting.func.save_concours()
 | 
			
		||||
	local input = io.open(fishing_setting.file_concours, "w")
 | 
			
		||||
	if input then
 | 
			
		||||
		input:write(minetest.serialize(fishing_setting.concours))
 | 
			
		||||
		input:close()
 | 
			
		||||
	else
 | 
			
		||||
		minetest.log("action","Open failed (mode:w) of " .. fishing_setting.file_concours)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--function load councours data from file 
 | 
			
		||||
function fishing_setting.func.load_concours()
 | 
			
		||||
	local file = io.open(fishing_setting.file_concours, "r")
 | 
			
		||||
	local settings = {}
 | 
			
		||||
	fishing_setting.concours = {}
 | 
			
		||||
	if file then
 | 
			
		||||
		 fishing_setting.concours= minetest.deserialize(file:read("*all"))
 | 
			
		||||
		file:close()
 | 
			
		||||
		if settings == nil or type(settings) ~= "table" then
 | 
			
		||||
			fishing_setting.concours = {}
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
--Menu fishing configuration
 | 
			
		||||
fishing_setting.func.on_show_settings_concours = function(player_name)
 | 
			
		||||
 | 
			
		||||
	if not fishing_setting.tmp_setting then
 | 
			
		||||
		fishing_setting.tmp_setting = {}
 | 
			
		||||
		fishing_setting.func.set_settings(fishing_setting.tmp_setting, fishing_setting.settings)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local formspec = "size[6,6]bgcolor[#99a8ba;]label[2,0;FISHING CONCOURS]"..
 | 
			
		||||
				--Time concours
 | 
			
		||||
				"label[1.6,0.5;Duration]"..
 | 
			
		||||
				"button[0,1;1,1;duration;-60]"..
 | 
			
		||||
				"button[1,1;1,1;duration;-600]"..
 | 
			
		||||
				"label[2.1,1.2;"..tostring(fishing_setting.tmp_setting["duration"]).."]"..
 | 
			
		||||
				"button[2.7,1;1,1;duration;+600]"..
 | 
			
		||||
				"button[3.7,1;1,1;duration;+60]"..
 | 
			
		||||
				--concours enable
 | 
			
		||||
				"label[0.5,2.5;concours enable]"..				
 | 
			
		||||
				"button[3.5,2.3;1,1;concours;"..tostring(fishing_setting.tmp_setting["concours"]).."]"..
 | 
			
		||||
				"label[0.5,4.8;reset classements]"..	
 | 
			
		||||
				"field[3,5;1,1;reset;;]"..
 | 
			
		||||
				
 | 
			
		||||
				
 | 
			
		||||
				"button_exit[0.5,5.2;1.5,1;save;Abort]"..
 | 
			
		||||
				"button_exit[4,5.2;1.5,1;save;Ok]"
 | 
			
		||||
 | 
			
		||||
	minetest.show_formspec(player_name, "fishing:concours", formspec)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
	if formname == "fishing:concours" then
 | 
			
		||||
		local name = player:get_player_name()
 | 
			
		||||
		if not name then return end
 | 
			
		||||
		if fields["save"] == "Ok" then
 | 
			
		||||
			fishing_setting.func.set_settings(fishing_setting.settings, fishing_setting.tmp_setting)
 | 
			
		||||
			fishing_setting.func.save()
 | 
			
		||||
			fishing_setting.tmp_setting = nil
 | 
			
		||||
			return
 | 
			
		||||
		elseif fields["quit"] or fields["abort"] then
 | 
			
		||||
			fishing_setting.tmp_setting = nil
 | 
			
		||||
			return
 | 
			
		||||
		elseif fields["duration"] then
 | 
			
		||||
			fishing_setting.tmp_setting["duration"] = inc(fishing_setting.tmp_setting["duration"], fields["duration"], 120, 14400)
 | 
			
		||||
		elseif fields["concours"] then
 | 
			
		||||
			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
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		fishing_setting.func.on_show_settings_concours(name)
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
minetest.register_chatcommand("fishing_concours", {
 | 
			
		||||
	params = "fishing_concours <true|false> <time-in-sec>",
 | 
			
		||||
	description = "enable|disable fishing concours (admin only)",
 | 
			
		||||
	privs = {server=true},
 | 
			
		||||
	func = function(player_name, param)
 | 
			
		||||
		if not player_name then return end
 | 
			
		||||
		fishing_setting.func.on_show_settings_concours(player_name)
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function spairs(t, order)
 | 
			
		||||
    -- collect the keys
 | 
			
		||||
    local keys = {}
 | 
			
		||||
    for k in pairs(t) do keys[#keys+1] = k end
 | 
			
		||||
    -- if order function given, sort by it by passing the table and keys a, b,
 | 
			
		||||
    -- otherwise just sort the keys 
 | 
			
		||||
    if order then
 | 
			
		||||
        table.sort(keys, function(a,b) return order(t, a, b) end)
 | 
			
		||||
    else
 | 
			
		||||
        table.sort(keys)
 | 
			
		||||
    end
 | 
			
		||||
    -- return the iterator function
 | 
			
		||||
    local i = 0
 | 
			
		||||
    return function()
 | 
			
		||||
        i = i + 1
 | 
			
		||||
        if keys[i] then
 | 
			
		||||
            return keys[i], t[keys[i]]
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function fishing_setting.func.set_winners(list)
 | 
			
		||||
	local win = {}
 | 
			
		||||
	local i = 1
 | 
			
		||||
	-- 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
 | 
			
		||||
		table.insert(win, {[k]=v})
 | 
			
		||||
	end	
 | 
			
		||||
	return win
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function fishing_setting.func.get_stat()
 | 
			
		||||
	local winners= {}
 | 
			
		||||
	for k,v in pairs(fishing_setting.concours) do
 | 
			
		||||
		if fishing_setting.concours[k] ~= nil then
 | 
			
		||||
			winners[k] = fishing_setting.func.set_winners(fishing_setting.concours[k])	
 | 
			
		||||
		else
 | 
			
		||||
			winners[k] = {}
 | 
			
		||||
    	end
 | 
			
		||||
    end --bgcolor[#99a8ba;]
 | 
			
		||||
	local formspec = {"size[11,8]bgcolor[#99a8ba;]label[3.5,0;FISHING CONCOURS CLASSEMENT]"}
 | 
			
		||||
	
 | 
			
		||||
	local X = 0
 | 
			
		||||
	local Y
 | 
			
		||||
 | 
			
		||||
	for fish,fishers in pairs(winners) do
 | 
			
		||||
		Y = 1.5
 | 
			
		||||
		table.insert(formspec, "label["..(X+0.4)..",1;"..tostring(fish):upper().."]") --fish name
 | 
			
		||||
		for _,s in ipairs(fishers) do
 | 
			
		||||
			for pl,nb in pairs(s) do
 | 
			
		||||
				table.insert(formspec, "label["..(X) ..","..Y..";"..tostring(nb).."]") -- nb fish catched
 | 
			
		||||
				table.insert(formspec, "label["..(X+0.4) ..","..Y..";"..tostring(pl).."]") -- playername
 | 
			
		||||
			end
 | 
			
		||||
			Y = Y + 0.5
 | 
			
		||||
		end
 | 
			
		||||
		X = X + 2.2
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return table.concat(formspec)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
minetest.register_chatcommand("fishing_class", {
 | 
			
		||||
	params = "display classement",
 | 
			
		||||
	description = "",
 | 
			
		||||
	privs = {interact=true},
 | 
			
		||||
	func = function(player_name, param)
 | 
			
		||||
		if not player_name then return end
 | 
			
		||||
		local formspec = fishing_setting.func.get_stat()
 | 
			
		||||
 | 
			
		||||
		minetest.show_formspec(player_name, "fishing:classement", formspec)
 | 
			
		||||
	end
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								init.lua
									
									
									
									
									
								
							@@ -21,8 +21,9 @@ fishing_setting.func = {}
 | 
			
		||||
fishing_setting.is_creative_mode = minetest.setting_getbool("creative_mode")
 | 
			
		||||
fishing_setting.file_settings = minetest.get_worldpath() .. "/fishing_config.txt"
 | 
			
		||||
fishing_setting.file_trophies = minetest.get_worldpath() .. "/fishing_trophies.txt"
 | 
			
		||||
 | 
			
		||||
fishing_setting.file_concours = minetest.get_worldpath() .. "/fishing_concours.txt"
 | 
			
		||||
fishing_setting.settings = {}
 | 
			
		||||
fishing_setting.concours = {}
 | 
			
		||||
--for random object 
 | 
			
		||||
random_objects = {}
 | 
			
		||||
fishing_setting.baits = {}
 | 
			
		||||
@@ -53,6 +54,8 @@ fishing_setting.settings["shark_chance"] = SHARK_CHANCE
 | 
			
		||||
fishing_setting.settings["tresor_chance"] = TRESOR_CHANCE
 | 
			
		||||
fishing_setting.settings["tresor_enable"] = TRESOR_RANDOM_ENABLE
 | 
			
		||||
fishing_setting.settings["escape_chance"] = ESCAPE_CHANCE
 | 
			
		||||
fishing_setting.settings["concours"] = CONCOURS
 | 
			
		||||
fishing_setting.settings["duration"] = DURATION
 | 
			
		||||
-- load config file if exist in worldpath
 | 
			
		||||
fishing_setting.func.load()
 | 
			
		||||
 | 
			
		||||
@@ -72,7 +75,8 @@ dofile(path .."poles.lua")
 | 
			
		||||
fishing_setting.func.hungry_random()
 | 
			
		||||
--load table catched fish by players
 | 
			
		||||
fishing_setting.func.load_trophies()
 | 
			
		||||
 | 
			
		||||
--load table concours
 | 
			
		||||
fishing_setting.func.load_concours()
 | 
			
		||||
-----------------------------------------------------------------------------------------------
 | 
			
		||||
minetest.log("action", "[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...")
 | 
			
		||||
-----------------------------------------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
@@ -10,3 +10,5 @@ SHARK_CHANCE = 50
 | 
			
		||||
TRESOR_CHANCE = 5
 | 
			
		||||
TRESOR_RANDOM_ENABLE = true
 | 
			
		||||
ESCAPE_CHANCE = 5
 | 
			
		||||
CONCOURS = false
 | 
			
		||||
DURATION = 1800
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user