2015-06-09 23:09:47 +02:00
2015-06-26 22:33:51 +02:00
--function save settings
2015-06-09 23:09:47 +02:00
function fishing_setting . func . save ( )
2015-06-26 22:33:51 +02:00
local input = io.open ( fishing_setting.file_settings , " w " )
2015-06-09 23:09:47 +02:00
if input then
input : write ( minetest.serialize ( fishing_setting.settings ) )
input : close ( )
else
2015-06-26 22:33:51 +02:00
minetest.log ( " action " , " Open failed (mode:w) of " .. fishing_setting.file_settings )
2015-06-09 23:09:47 +02:00
end
end
2015-06-17 02:18:12 +02:00
function fishing_setting . func . set_settings ( new_settings , settings )
2015-06-09 23:09:47 +02:00
if settings [ " message " ] ~= nil then
2015-06-17 02:18:12 +02:00
new_settings [ " message " ] = settings [ " message " ]
2015-06-09 23:09:47 +02:00
end
2015-06-28 20:06:16 +02:00
2015-06-09 23:09:47 +02:00
if settings [ " worm_is_mob " ] ~= nil then
2015-06-17 02:18:12 +02:00
new_settings [ " worm_is_mob " ] = settings [ " worm_is_mob " ]
2015-06-28 20:06:16 +02:00
end
2015-06-09 23:09:47 +02:00
if settings [ " worm_chance " ] ~= nil then
2015-06-17 02:18:12 +02:00
new_settings [ " worm_chance " ] = settings [ " worm_chance " ]
2015-06-28 20:06:16 +02:00
end
2015-06-09 23:09:47 +02:00
if settings [ " new_worm_source " ] ~= nil then
2015-06-17 02:18:12 +02:00
new_settings [ " new_worm_source " ] = settings [ " new_worm_source " ]
2015-06-28 20:06:16 +02:00
end
2015-06-09 23:09:47 +02:00
if settings [ " wear_out " ] ~= nil then
2015-06-17 02:18:12 +02:00
new_settings [ " wear_out " ] = settings [ " wear_out " ]
2015-06-09 23:09:47 +02:00
end
if settings [ " bobber_view_range " ] ~= nil then
2015-06-17 02:18:12 +02:00
new_settings [ " bobber_view_range " ] = settings [ " bobber_view_range " ]
2015-06-09 23:09:47 +02:00
end
if settings [ " simple_deco_fishing_pole " ] ~= nil then
2015-06-17 02:18:12 +02:00
new_settings [ " simple_deco_fishing_pole " ] = settings [ " simple_deco_fishing_pole " ]
2015-06-09 23:09:47 +02:00
end
2015-06-17 02:18:12 +02:00
if settings [ " fish_chance " ] ~= nil then
new_settings [ " fish_chance " ] = settings [ " fish_chance " ]
2015-06-09 23:09:47 +02:00
end
2015-06-17 02:18:12 +02:00
if settings [ " tresor_chance " ] ~= nil then
new_settings [ " tresor_chance " ] = settings [ " tresor_chance " ]
2015-06-09 23:09:47 +02:00
end
2015-06-17 02:18:12 +02:00
if settings [ " shark_chance " ] ~= nil then
new_settings [ " shark_chance " ] = settings [ " shark_chance " ]
2015-06-09 23:09:47 +02:00
end
2015-06-28 20:06:16 +02:00
2015-06-26 22:33:51 +02:00
if settings [ " tresor_enable " ] ~= nil then
new_settings [ " tresor_enable " ] = settings [ " tresor_enable " ]
2015-06-09 23:09:47 +02:00
end
2015-06-28 20:06:16 +02:00
2015-06-26 22:33:51 +02:00
if settings [ " escape_chance " ] ~= nil then
new_settings [ " escape_chance " ] = settings [ " escape_chance " ]
2015-06-28 20:06:16 +02:00
end
2015-06-17 02:18:12 +02:00
end
--function load settings from file
function fishing_setting . func . load ( )
2015-06-26 22:33:51 +02:00
local file = io.open ( fishing_setting.file_settings , " r " )
2015-06-17 02:18:12 +02:00
local settings = { }
if file then
settings = minetest.deserialize ( file : read ( " *all " ) )
file : close ( )
if settings and type ( settings ) == " table " then
fishing_setting.func . set_settings ( fishing_setting.settings , settings )
end
2015-06-09 23:09:47 +02:00
end
end
--function return wear tool value (old or new)
function fishing_setting . func . wear_value ( wear )
local used = 0
if wear == " random " then
used = ( 2000 * ( math.random ( 20 , 29 ) ) )
elseif wear == " randomtools " then
used = ( 65535 / ( 30 - ( math.random ( 15 , 29 ) ) ) )
end
return used
end
2015-06-26 22:33:51 +02:00
-- function return table where mods actived
function fishing_setting . func . ignore_mod ( list )
local listOk = { }
for i , v in ipairs ( list ) do
if minetest.get_modpath ( v [ 1 ] ) ~= nil then
table.insert ( listOk , v )
end
end
return listOk
end
2015-06-09 23:09:47 +02:00
2015-06-16 01:42:05 +02:00
--function random hungry by bait type
function fishing_setting . func . hungry_random ( )
for i , a in pairs ( fishing_setting.baits ) do
fishing_setting.baits [ i ] [ " hungry " ] = math.random ( 15 , 80 )
end
2015-06-26 22:33:51 +02:00
--change hungry after random time, min 0h30, max 6h00
minetest.after ( math.random ( 1 , 12 ) * 1800 , function ( ) fishing_setting.func . hungry_random ( ) end )
2015-06-16 01:42:05 +02:00
end
2015-06-09 23:09:47 +02:00
2015-06-16 01:42:05 +02:00
-- show notification when player catch tresor
function fishing_setting . func . notify ( f_name , tresor )
2015-06-27 15:18:34 +02:00
local title = fishing_setting.func . S ( " Good luck to %s, He catch the tresor, %s! " ) : format ( f_name , tresor [ 4 ] )
2015-06-16 01:42:05 +02:00
for _ , player in ipairs ( minetest.get_connected_players ( ) ) do
2015-06-26 22:33:51 +02:00
local player_name = player : get_player_name ( )
if player_name == f_name then
2015-06-27 15:18:34 +02:00
minetest.chat_send_player ( player_name , fishing_setting.func . S ( " You catch the tresor, %s! " ) : format ( tresor [ 4 ] ) )
2015-06-26 22:33:51 +02:00
else
minetest.chat_send_player ( player_name , title )
end
2015-06-16 01:42:05 +02:00
end
end
2015-06-09 23:09:47 +02:00
2015-06-16 01:42:05 +02:00
--Menu fishing configuration
2015-06-26 22:33:51 +02:00
fishing_setting.func . on_show_settings = function ( player_name )
2015-06-17 02:18:12 +02:00
if not fishing_setting.tmp_setting then
fishing_setting.tmp_setting = { }
fishing_setting.func . set_settings ( fishing_setting.tmp_setting , fishing_setting.settings )
end
2015-06-28 20:06:16 +02:00
local formspec = " size[10.8,9]label[4,0;FISHING CONFIGURATION] " ..
2015-06-16 01:42:05 +02:00
--Chance fish
" label[1.6,0.5;Chance fish] " ..
2015-06-17 02:18:12 +02:00
" button[0,1;1,1;cfish;-1] " ..
" button[1,1;1,1;cfish;-10] " ..
" label[2.1,1.2; " .. tostring ( fishing_setting.tmp_setting [ " fish_chance " ] ) .. " ] " ..
" button[2.7,1;1,1;cfish;+10] " ..
" button[3.7,1;1,1;cfish;+1] " ..
2015-06-16 01:42:05 +02:00
--Chance shark
" label[1.5,2;Chance shark] " ..
2015-06-17 02:18:12 +02:00
" button[0,2.5;1,1;cshark;-1] " ..
" button[1,2.5;1,1;cshark;-10] " ..
" label[2.1,2.7; " .. tostring ( fishing_setting.tmp_setting [ " shark_chance " ] ) .. " ] " ..
" button[2.7,2.5;1,1;cshark;+10] " ..
" button[3.7,2.5;1,1;cshark;+1] " ..
2015-06-16 01:42:05 +02:00
--Chance tresor
" label[1.5,3.5;Chance tresor] " ..
2015-06-17 02:18:12 +02:00
" button[0,4.;1,1;ctresor;-1] " ..
" button[1,4;1,1;ctresor;-10] " ..
" label[2.1,4.2; " .. tostring ( fishing_setting.tmp_setting [ " tresor_chance " ] ) .. " ] " ..
" button[2.7,4;1,1;ctresor;+10] " ..
" button[3.7,4;1,1;ctresor;+1] " ..
2015-06-16 01:42:05 +02:00
--Chance worm
2015-06-26 22:33:51 +02:00
" label[7.5,0.5;Chance worm] " ..
" button[6,1;1,1;cworm;-1] " ..
" button[7,1;1,1;cworm;-10] " ..
" label[8.1,1.2; " .. tostring ( fishing_setting.tmp_setting [ " worm_chance " ] ) .. " ] " ..
" button[8.7,1;1,1;cworm;+10] " ..
" button[9.7,1;1,1;cworm;+1] " ..
--Chance escape
2015-06-28 20:06:16 +02:00
" label[7.4,2;Chance escape] " ..
" button[6,2.5;1,1;cescape;-1] " ..
" button[7,2.5;1,1;cescape;-10] " ..
2015-06-26 22:33:51 +02:00
" label[8.1,2.7; " .. tostring ( fishing_setting.tmp_setting [ " escape_chance " ] ) .. " ] " ..
2015-06-28 20:06:16 +02:00
" button[8.7,2.5;1,1;cescape;+10] " ..
" button[9.7,2.5;1,1;cescape;+1] " ..
2015-06-26 22:33:51 +02:00
--Bobber view range
" label[7.2,3.5;Bobber view range] " ..
" button[7,4;1,1;bvrange;-1] " ..
" label[8.1,4.2; " .. tostring ( fishing_setting.tmp_setting [ " bobber_view_range " ] ) .. " ] " ..
" button[8.7,4;1,1;bvrange;+1] " ..
2015-06-17 02:18:12 +02:00
--messages display
" label[0,5.7;Display messages in chat] " ..
" button[3.7,5.5;1,1;dmessages; " .. tostring ( fishing_setting.tmp_setting [ " message " ] ) .. " ] " ..
--poledeco
" label[0,6.5;Simple pole deco] " ..
" button[3.7,6.3;1,1;poledeco; " .. tostring ( fishing_setting.tmp_setting [ " simple_deco_fishing_pole " ] ) .. " ] " ..
--wearout
2015-06-28 20:06:16 +02:00
" label[0,7.3;Poles Wear] " ..
2015-06-17 02:18:12 +02:00
" button[3.7,7.1;1,1;wearout; " .. tostring ( fishing_setting.tmp_setting [ " wear_out " ] ) .. " ] " ..
2015-06-26 22:33:51 +02:00
--TRESOR_ENABLE
" label[6,5.7;Tresor enable] " ..
" button[9.7,5.5;1,1;tresorenable; " .. tostring ( fishing_setting.tmp_setting [ " tresor_enable " ] ) .. " ] " ..
2015-06-17 02:18:12 +02:00
--NEW_WORM_SOURCE
2015-06-28 20:06:16 +02:00
" label[6,6.5;New worm source (reboot)] " ..
2015-06-17 02:18:12 +02:00
" button[9.7,6.3;1,1;newworm; " .. tostring ( fishing_setting.tmp_setting [ " new_worm_source " ] ) .. " ] " ..
--WORM_IS_MOB
2015-06-28 20:06:16 +02:00
" label[6,7.3;Worm is mob (reboot)] " ..
2015-06-17 02:18:12 +02:00
" button[9.7,7.1;1,1;wormmob; " .. tostring ( fishing_setting.tmp_setting [ " worm_is_mob " ] ) .. " ] " ..
2015-06-28 20:06:16 +02:00
" button_exit[0,8.2;1.5,1;save;Abort] " ..
" button_exit[9.2,8.2;1.5,1;save;Ok] "
2015-06-26 22:33:51 +02:00
minetest.show_formspec ( player_name , " fishing:settings " , formspec )
2015-06-17 02:18:12 +02:00
end
2015-06-16 01:42:05 +02:00
2015-06-17 02:18:12 +02:00
local inc = function ( value , field , min , max )
local v
if field == " +1 " then
v = value + 1
elseif field == " +10 " then
v = value + 10
2015-06-28 20:06:16 +02:00
elseif field == " +60 " then
2015-06-27 15:18:34 +02:00
v = value + 60
2015-06-27 23:14:10 +02:00
elseif field == " +600 " then
v = value + 600
2015-06-28 20:06:16 +02:00
elseif field == " -1 " then
2015-06-17 02:18:12 +02:00
v = value - 1
elseif field == " -10 " then
v = value - 10
2015-06-28 20:06:16 +02:00
elseif field == " -60 " then
2015-06-17 02:18:12 +02:00
v = value - 60
2015-06-28 20:06:16 +02:00
elseif field == " -600 " then
2015-06-27 23:14:10 +02:00
v = value - 600
2015-06-17 02:18:12 +02:00
else -- useless, prevent crash
return value
end
2015-06-16 01:42:05 +02:00
2015-06-17 02:18:12 +02:00
if v > max then
v = max
end
if v < min then
v = min
end
return v
end
2015-06-16 01:42:05 +02:00
2015-06-17 02:18:12 +02:00
local bool = function ( field )
local v
if field == " true " then
v = false
else
v = true
end
return v
2015-06-16 01:42:05 +02:00
end
minetest.register_on_player_receive_fields ( function ( player , formname , fields )
2015-06-28 20:06:16 +02:00
local player_name = player : get_player_name ( )
if not player_name then return end
2015-06-16 01:42:05 +02:00
if formname == " fishing:settings " then
2015-06-17 02:18:12 +02:00
if fields [ " save " ] == " Ok " then
2015-06-26 22:33:51 +02:00
fishing_setting.func . set_settings ( fishing_setting.settings , fishing_setting.tmp_setting )
fishing_setting.func . save ( )
fishing_setting.tmp_setting = nil
2015-06-16 01:42:05 +02:00
return
2015-06-17 02:18:12 +02:00
elseif fields [ " quit " ] or fields [ " abort " ] then
fishing_setting.tmp_setting = nil
2015-06-16 01:42:05 +02:00
return
2015-06-17 02:18:12 +02:00
elseif fields [ " cfish " ] then
fishing_setting.tmp_setting [ " fish_chance " ] = inc ( fishing_setting.tmp_setting [ " fish_chance " ] , fields [ " cfish " ] , 1 , 100 )
elseif fields [ " cshark " ] then
fishing_setting.tmp_setting [ " shark_chance " ] = inc ( fishing_setting.tmp_setting [ " shark_chance " ] , fields [ " cshark " ] , 1 , 100 )
elseif fields [ " ctresor " ] then
fishing_setting.tmp_setting [ " tresor_chance " ] = inc ( fishing_setting.tmp_setting [ " tresor_chance " ] , fields [ " ctresor " ] , 1 , 100 )
elseif fields [ " bvrange " ] then
fishing_setting.tmp_setting [ " bobber_view_range " ] = inc ( fishing_setting.tmp_setting [ " bobber_view_range " ] , fields [ " bvrange " ] , 4 , 20 )
elseif fields [ " cworm " ] then
fishing_setting.tmp_setting [ " worm_chance " ] = inc ( fishing_setting.tmp_setting [ " worm_chance " ] , fields [ " cworm " ] , 1 , 100 )
2015-06-26 22:33:51 +02:00
elseif fields [ " cescape " ] then
2015-06-28 20:06:16 +02:00
fishing_setting.tmp_setting [ " escape_chance " ] = inc ( fishing_setting.tmp_setting [ " escape_chance " ] , fields [ " cescape " ] , 1 , 50 )
2015-06-17 02:18:12 +02:00
elseif fields [ " dmessages " ] then
fishing_setting.tmp_setting [ " message " ] = bool ( fields [ " dmessages " ] )
elseif fields [ " poledeco " ] then
fishing_setting.tmp_setting [ " simple_deco_fishing_pole " ] = bool ( fields [ " poledeco " ] )
elseif fields [ " wearout " ] then
fishing_setting.tmp_setting [ " wear_out " ] = bool ( fields [ " wearout " ] )
elseif fields [ " tresorenable " ] then
2015-06-26 22:33:51 +02:00
fishing_setting.tmp_setting [ " tresor_enable " ] = bool ( fields [ " tresorenable " ] )
2015-06-17 02:18:12 +02:00
elseif fields [ " newworm " ] then
fishing_setting.tmp_setting [ " new_worm_source " ] = bool ( fields [ " newworm " ] )
elseif fields [ " wormmob " ] then
fishing_setting.tmp_setting [ " worm_is_mob " ] = bool ( fields [ " wormmob " ] )
2015-06-16 01:42:05 +02:00
else
return
end
2015-06-28 20:06:16 +02:00
fishing_setting.func . on_show_settings ( player_name )
elseif formname == " fishing:admin_conf " then
if fields [ " classement " ] then
local formspec = fishing_setting.func . get_stat ( )
minetest.show_formspec ( player_name , " fishing:classement " , formspec )
elseif fields [ " concours " ] then
fishing_setting.func . on_show_settings_concours ( player_name )
elseif fields [ " configuration " ] then
fishing_setting.func . on_show_settings ( player_name )
end
2015-06-16 01:42:05 +02:00
end
2015-06-09 23:09:47 +02:00
end )
2015-06-26 22:33:51 +02:00
--function load settings from file
function fishing_setting . func . load_trophies ( )
local file = io.open ( fishing_setting.file_trophies , " r " )
fishing_setting.trophies = { }
if file then
fishing_setting.trophies = minetest.deserialize ( file : read ( " *all " ) )
file : close ( )
2015-06-28 03:01:16 +02:00
if not fishing_setting.trophies or type ( fishing_setting.trophies ) ~= " table " then
2015-06-26 22:33:51 +02:00
fishing_setting.trophies = { }
end
end
end
function fishing_setting . func . save_trophies ( )
local input = io.open ( fishing_setting.file_trophies , " w " )
if input then
input : write ( minetest.serialize ( fishing_setting.trophies ) )
input : close ( )
else
minetest.log ( " action " , " Open failed (mode:w) of " .. fishing_setting.file_trophies )
end
end
minetest.register_on_shutdown ( function ( )
minetest.log ( " action " , " [fishing] Server shuts down. saving trophies table " )
fishing_setting.func . save_trophies ( )
2015-06-28 03:01:16 +02:00
fishing_setting.func . save_concours ( )
2015-06-26 22:33:51 +02:00
end )
2015-06-28 03:01:16 +02:00
2015-06-28 20:06:16 +02:00
function fishing_setting . func . timetostr ( time )
local countdown = time
local answer = " "
if countdown >= 3600 then
local hours = math.floor ( countdown / 3600 )
countdown = countdown % 3600
answer = hours .. " H "
end
if countdown >= 60 then
local minutes = math.floor ( countdown / 60 )
countdown = countdown % 60
answer = answer .. minutes .. " M "
end
local seconds = countdown
answer = answer .. math.floor ( seconds ) .. " S "
return answer
end
2015-06-26 22:33:51 +02:00
minetest.register_on_joinplayer ( function ( player )
2015-06-28 20:06:16 +02:00
local player_name = player : get_player_name ( )
if fishing_setting.concours [ " concours " ] == true then
minetest.chat_send_player ( player_name , fishing_setting.func . S ( " A fishing contest is in progress. (remaining time %s) " ) : format ( fishing_setting.func . timetostr ( fishing_setting.concours [ " duration " ] ) ) )
end
2015-06-26 22:33:51 +02:00
end )
2015-06-28 20:06:16 +02:00
2015-06-26 22:33:51 +02:00
2015-06-27 15:18:34 +02:00
function fishing_setting . func . add_to_trophies ( player , fish , desc )
2015-06-26 22:33:51 +02:00
local player_name = player : get_player_name ( )
if not player_name then return end
2015-06-28 21:39:41 +02:00
if fish == " fish_raw " or fish == " shark_raw " or fish == " pike_raw " or fish == " clownfish_raw " or fish == " bluewhite_raw " then
2015-06-28 03:01:16 +02:00
if fishing_setting.trophies [ fish ] == nil then
fishing_setting.trophies [ fish ] = { }
end
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 ] ) )
2015-06-26 22:33:51 +02:00
local inv = player : get_inventory ( )
local name = " fishing:trophy_ " .. fish
if inv : room_for_item ( " main " , { name = name , count = 1 , wear = 0 , metadata = " " } ) then
inv : add_item ( " main " , { name = name , count = 1 , wear = 0 , metadata = " " } )
else
minetest.spawn_item ( player : getpos ( ) , { name = name , count = 1 , wear = 0 , metadata = " " } )
end
end
2015-06-27 23:14:10 +02:00
2015-06-28 03:01:16 +02:00
if fishing_setting.concours [ " concours " ] ~= nil and fishing_setting.concours [ " concours " ] == true then
2015-06-27 23:14:10 +02:00
if fishing_setting.concours [ fish ] == nil then
fishing_setting.concours [ fish ] = { }
end
2015-06-28 03:01:16 +02:00
fishing_setting.concours [ fish ] [ player_name ] = ( fishing_setting.concours [ fish ] [ player_name ] or 0 ) + 1
2015-06-27 23:14:10 +02:00
minetest.chat_send_all ( fishing_setting.func . S ( " Yeah, %s catch " .. desc ) : format ( player_name ) )
end
2015-06-26 22:33:51 +02:00
end
end
2015-06-28 20:06:16 +02:00
--Menu fishing configuration
fishing_setting.func . on_show_admin_menu = function ( player_name )
local formspec = " size[5,5]label[1.6,0;FISHING MENU] " ..
" button[1,0.5;3,1;classement;Classement concours] " ..
" button[1,1.5;3,1;concours;Concours] " ..
" button[1,2.5;3,1;configuration;Configuration] " ..
" button_exit[1,4.5;3,1;close;Close] "
minetest.show_formspec ( player_name , " fishing:admin_conf " , formspec )
end
2015-06-26 22:33:51 +02:00
if ( minetest.get_modpath ( " unified_inventory " ) ) then
unified_inventory.register_button ( " menu_fishing " , {
type = " image " ,
2015-06-27 20:33:36 +02:00
image = " fishing_fish_raw.png " ,
2015-06-26 22:33:51 +02:00
tooltip = " fishing menu configuration " ,
action = function ( player )
local player_name = player : get_player_name ( )
if not player_name then return end
if minetest.check_player_privs ( player_name , { server = true } ) then
2015-06-28 20:06:16 +02:00
fishing_setting.func . on_show_admin_menu ( player_name )
2015-06-26 22:33:51 +02:00
else
2015-06-28 20:06:16 +02:00
local formspec = fishing_setting.func . get_stat ( )
minetest.show_formspec ( player_name , " fishing:classement " , formspec )
2015-06-26 22:33:51 +02:00
end
end ,
} )
end
2015-06-27 23:14:10 +02:00
--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 = { }
2015-06-28 20:06:16 +02:00
fishing_setting.concours = { [ " concours " ] = false , [ " duration " ] = 3600 , [ " bobber_nb " ] = 4 }
2015-06-27 23:14:10 +02:00
if file then
fishing_setting.concours = minetest.deserialize ( file : read ( " *all " ) )
file : close ( )
if settings == nil or type ( settings ) ~= " table " then
2015-06-28 20:06:16 +02:00
fishing_setting.concours = { [ " concours " ] = false , [ " duration " ] = 3600 , [ " bobber_nb " ] = 4 }
2015-06-27 23:14:10 +02:00
end
end
end
--Menu fishing configuration
fishing_setting.func . on_show_settings_concours = function ( player_name )
if not fishing_setting.tmp_setting then
2015-06-28 20:06:16 +02:00
fishing_setting.tmp_setting = { [ " concours " ] = ( fishing_setting.concours [ " concours " ] or false ) ,
[ " duration " ] = ( math.floor ( fishing_setting.concours [ " duration " ] ) or 3600 ) ,
[ " bobber_nb " ] = ( fishing_setting.concours [ " bobber_nb " ] or 2 ) ,
[ " reset " ] = " "
}
2015-06-27 23:14:10 +02:00
end
2015-06-28 20:06:16 +02:00
local formspec = " size[6.1,7]label[1.9,0;FISHING CONCOURS] " ..
2015-06-27 23:14:10 +02:00
--Time concours
2015-06-28 20:06:16 +02:00
" label[2.2,0.5;Duration(in sec)] " ..
" button[0.8,1;1,1;duration;-60] " ..
" button[1.8,1;1,1;duration;-600] " ..
" label[2.7,1.2; " .. tostring ( fishing_setting.tmp_setting [ " duration " ] ) .. " ] " ..
" button[3.5,1;1,1;duration;+600] " ..
" button[4.5,1;1,1;duration;+60] " ..
--bobber nb
" label[2,2;Bobber number limit] " ..
" button[1.8,2.5;1,1;bobbernb;-1] " ..
" label[2.9,2.7; " .. tostring ( fishing_setting.tmp_setting [ " bobber_nb " ] ) .. " ] " ..
" button[3.5,2.5;1,1;bobbernb;+1] " ..
2015-06-27 23:14:10 +02:00
--concours enable
2015-06-28 20:06:16 +02:00
" label[0.8,3.8;concours enable] " ..
" button[4.5,3.6;1,1;concours; " .. tostring ( fishing_setting.tmp_setting [ " concours " ] ) .. " ] " ..
2015-06-28 03:01:16 +02:00
--reset
2015-06-28 20:06:16 +02:00
" label[0.8,5.2;reset classements (type 'yes')] " ..
" field[4.8,5.4;1,1;reset;;] " ..
" button_exit[0.8,6.2;1.5,1;save;Abort] " ..
" button_exit[4,6.2;1.5,1;save;Ok] "
2015-06-27 23:14:10 +02:00
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
2015-06-28 03:01:16 +02:00
if fields [ " reset " ] and fields [ " reset " ] : lower ( ) == " yes " then
fishing_setting.concours [ " fish_raw " ] = { }
fishing_setting.concours [ " clownfish_raw " ] = { }
2015-06-28 21:39:41 +02:00
fishing_setting.concours [ " bluewhite_raw " ] = { }
2015-06-28 03:01:16 +02:00
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 " ]
2015-06-28 20:06:16 +02:00
fishing_setting.concours [ " bobber_nb " ] = fishing_setting.tmp_setting [ " bobber_nb " ]
2015-06-28 03:01:16 +02:00
if progress == false and fishing_setting.tmp_setting [ " concours " ] == true then
fishing_setting.concours [ " concours " ] = true
fishing_setting.concours [ " warning_said " ] = false
2015-06-28 20:06:16 +02:00
local time = fishing_setting.func . timetostr ( fishing_setting.concours [ " duration " ] )
minetest.chat_send_all ( fishing_setting.func . S ( " Attention, Fishing contest start (duration %s)!!! " ) : format ( time ) )
2015-06-28 21:39:41 +02:00
minetest.sound_play ( " fishing_contest_start " , { gain = 0.8 } )
2015-06-28 03:01:16 +02:00
elseif progress == true and fishing_setting.tmp_setting [ " concours " ] == false then
fishing_setting.concours [ " concours " ] = false
end
fishing_setting.func . save_concours ( )
2015-06-27 23:14:10 +02:00
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 " ] )
2015-06-28 20:06:16 +02:00
elseif fields [ " bobbernb " ] then
fishing_setting.tmp_setting [ " bobber_nb " ] = inc ( fishing_setting.tmp_setting [ " bobber_nb " ] , fields [ " bobbernb " ] , 1 , 8 )
2015-06-27 23:14:10 +02:00
else
return
end
fishing_setting.func . on_show_settings_concours ( name )
end
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 } )
2015-06-28 03:01:16 +02:00
if # win >= 6 then
break
end
end
2015-06-27 23:14:10 +02:00
return win
end
function fishing_setting . func . get_stat ( )
local winners = { }
for k , v in pairs ( fishing_setting.concours ) do
2015-06-28 03:01:16 +02:00
if string.find ( k , " _raw " ) ~= nil then
if fishing_setting.concours [ k ] ~= nil then
2015-06-28 20:06:16 +02:00
winners [ k ] = fishing_setting.func . set_winners ( fishing_setting.concours [ k ] )
2015-06-28 03:01:16 +02:00
else
winners [ k ] = { }
2015-06-28 20:06:16 +02:00
end
end
end
local formspec = { " size[12,8]label[3.7,0;FISHING CONCOURS CLASSEMENT] " }
2015-06-27 23:14:10 +02:00
local X = 0
local Y
2015-06-28 03:01:16 +02:00
for fish , fishers in pairs ( winners ) do
2015-06-28 20:06:16 +02:00
Y = 1.1
2015-06-28 03:01:16 +02:00
table.insert ( formspec , " label[ " .. ( X + 0.4 ) .. " ,0.5; " .. string.gsub ( fish , " _raw " , " " ) : upper ( ) .. " ] " ) --fish name
2015-06-27 23:14:10 +02:00
for _ , s in ipairs ( fishers ) do
for pl , nb in pairs ( s ) do
table.insert ( formspec , " label[ " .. ( X ) .. " , " .. Y .. " ; " .. tostring ( nb ) .. " ] " ) -- nb fish catched
2015-06-28 03:01:16 +02:00
table.insert ( formspec , " label[ " .. ( X + 0.5 ) .. " , " .. Y .. " ; " .. tostring ( pl ) .. " ] " ) -- playername
2015-06-27 23:14:10 +02:00
end
2015-06-28 03:01:16 +02:00
Y = Y + 0.4
2015-06-27 23:14:10 +02:00
end
2015-06-28 03:01:16 +02:00
X = X + 2.3
2015-06-27 23:14:10 +02:00
end
2015-06-28 20:06:16 +02:00
table.insert ( formspec , " button_exit[5.5,7.5;1.2,1;close;CLose] " )
2015-06-27 23:14:10 +02:00
return table.concat ( formspec )
end
2015-06-28 20:06:16 +02:00
minetest.register_chatcommand ( " fishing_menu " , {
params = " " ,
description = " Show fishing menu (admin only) " ,
privs = { server = true } ,
func = function ( player_name , param )
if not player_name then return end
fishing_setting.func . on_show_admin_menu ( player_name )
end
} )
minetest.register_chatcommand ( " fishing_classement " , {
2015-06-27 23:14:10 +02:00
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
} )
2015-06-28 03:01:16 +02:00
local function show_result ( )
minetest.after ( 3 , function ( )
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
minetest.show_formspec ( player_name , " fishing:classement " , formspec )
2015-06-28 20:06:16 +02:00
end
2015-06-28 03:01:16 +02:00
end
end )
end
2015-06-27 23:14:10 +02:00
2015-06-28 03:01:16 +02:00
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
2015-06-28 20:06:16 +02:00
minetest.chat_send_all ( fishing_setting.func . S ( " WARNING, Fishing contest will finish in 30 seconds. " ) )
2015-06-28 03:01:16 +02:00
fishing_setting.concours [ " warning_said " ] = true
end
if fishing_setting.concours [ " duration " ] < 0 then
2015-06-28 20:06:16 +02:00
minetest.chat_send_all ( fishing_setting.func . S ( " End of fishing contest. " ) )
minetest.sound_play ( " fishing_contest_end " , { gain = 0.8 } )
2015-06-28 03:01:16 +02:00
fishing_setting.concours [ " concours " ] = false
show_result ( )
end
end
end )
2015-06-27 23:14:10 +02:00