mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2025-07-12 12:50:22 +02:00
initial commit
subgame + mods
This commit is contained in:
23
mods/player_notes/API.txt
Executable file
23
mods/player_notes/API.txt
Executable file
@ -0,0 +1,23 @@
|
||||
Minetest player_notes mod - API
|
||||
===============================
|
||||
|
||||
player_notes.add_note(name, target, note)
|
||||
Adds a note to a player
|
||||
Returns nil on success, otherwise error string
|
||||
^ name -> player or object which added the note
|
||||
^ target -> to which player the note should get added
|
||||
^ note -> the note text to add to <name>
|
||||
|
||||
player_notes.rm_note(target, key)
|
||||
Removes a note from a player
|
||||
Returns nil on success, otherwise error string
|
||||
^ target -> from which player the note should get removed
|
||||
^ key -> key of the note to remove from <name>
|
||||
|
||||
player_notes.save_data()
|
||||
Saves changed data (use this after add_note or rm_note)
|
||||
Returns nothing
|
||||
|
||||
player_notes.player[]
|
||||
player_notes.player["dummy"] = { key1 = note1, key2 = note2, ... }
|
||||
|
6
mods/player_notes/README.md
Executable file
6
mods/player_notes/README.md
Executable file
@ -0,0 +1,6 @@
|
||||
player_notes
|
||||
============
|
||||
|
||||
Player notes mod for Minetest
|
||||
|
||||
License for everything: WTFPL
|
98
mods/player_notes/data_mgr.lua
Executable file
98
mods/player_notes/data_mgr.lua
Executable file
@ -0,0 +1,98 @@
|
||||
-- Created by Krock
|
||||
-- License: WTFPL
|
||||
|
||||
player_notes.load_data = function()
|
||||
local file = io.open(player_notes.data_file, "r")
|
||||
if not file then
|
||||
return
|
||||
end
|
||||
for line in file:lines() do
|
||||
if line ~= "" then
|
||||
local data = string.split(line, "|")
|
||||
--[1] player_name, [2] key 1, [3] notice 1, [?] key X, [?+1] notice X
|
||||
if #data > 1 then
|
||||
player_notes.player[data[1]] = {}
|
||||
local index = 2
|
||||
while index <= #data do
|
||||
if data[index] ~= "" then
|
||||
-- if not empty
|
||||
player_notes.player[data[1]][data[index]] = data[index + 1]
|
||||
end
|
||||
index = index + 2
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
io.close(file)
|
||||
end
|
||||
|
||||
-- Load late, because not much used
|
||||
minetest.after(3, player_notes.load_data)
|
||||
|
||||
player_notes.save_data = function()
|
||||
local file = io.open(player_notes.data_file, "w")
|
||||
for player, notes in pairs(player_notes.player) do
|
||||
local str = ""
|
||||
for key, _note in pairs(notes) do
|
||||
local note = string.gsub(_note, "|", "/")
|
||||
str = str..key.."|"..note.."|"
|
||||
end
|
||||
if string.len(str) > 2 then
|
||||
file:write(player.."|"..str.."\n")
|
||||
end
|
||||
end
|
||||
io.close(file)
|
||||
end
|
||||
|
||||
player_notes.add_note = function(name, target, note)
|
||||
if not name or not target or not note then
|
||||
return "ERROR: Name, target or note == NIL"
|
||||
end
|
||||
if not minetest.auth_table[target] then
|
||||
return "Unknown player: "..target
|
||||
end
|
||||
if string.len(note) < 2 or string.len(note) > 60 then
|
||||
return "Note is too short or too long to add. Sorry."
|
||||
end
|
||||
if not player_notes.player[target] then
|
||||
player_notes.player[target] = {}
|
||||
end
|
||||
-- generate random key
|
||||
local key = tostring(math.random(player_notes.key_min, player_notes.key_max))
|
||||
if player_notes.enable_timestamp ~= "" then
|
||||
player_notes.player[target][key] = "<"..name.." ("..os.date(player_notes.enable_timestamp)..")> "..note
|
||||
else
|
||||
player_notes.player[target][key] = "<"..name.."> "..note
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
player_notes.rm_note = function(target, key)
|
||||
if not target or not key then
|
||||
return "ERROR: Target or key == NIL"
|
||||
end
|
||||
if not player_notes.player[target] then
|
||||
return "Player has no notes so far."
|
||||
end
|
||||
-- must be unique key
|
||||
key = tonumber(key)
|
||||
if not key then
|
||||
return "Key must be a number!"
|
||||
end
|
||||
if not player_notes.player[target][tostring(key)] then
|
||||
return "Key does not exist. Can not remove unknown note."
|
||||
end
|
||||
player_notes.player[target][tostring(key)] = nil
|
||||
local delete = true
|
||||
for key, note in pairs(player_notes.player[target]) do
|
||||
if string.len(note) > 2 then
|
||||
delete = false
|
||||
break
|
||||
end
|
||||
end
|
||||
-- remove empty players
|
||||
if delete then
|
||||
player_notes.player[target] = nil
|
||||
end
|
||||
return nil
|
||||
end
|
0
mods/player_notes/depends.txt
Executable file
0
mods/player_notes/depends.txt
Executable file
183
mods/player_notes/init.lua
Executable file
183
mods/player_notes/init.lua
Executable file
@ -0,0 +1,183 @@
|
||||
-- Created by Krock
|
||||
-- License: WTFPL
|
||||
|
||||
player_notes = {}
|
||||
player_notes.player = {}
|
||||
player_notes.mod_path = minetest.get_modpath("player_notes")
|
||||
player_notes.data_file = minetest.get_worldpath().."/player_notes.data"
|
||||
player_notes.mgr = {}
|
||||
|
||||
-- to generate unique 4-digit long numbers as key
|
||||
player_notes.enable_timestamp = "%x %X" -- %x = date | %X = time -> "%x %X"
|
||||
player_notes.key_min = 100
|
||||
player_notes.key_max = 999
|
||||
|
||||
dofile(player_notes.mod_path.."/data_mgr.lua")
|
||||
minetest.register_privilege("player_notes", "Can view and modify player's notes.")
|
||||
|
||||
minetest.register_chatcommand("notes", {
|
||||
description = "Lists all notes / Lists notes of <name>",
|
||||
privs = {player_notes=true},
|
||||
func = function(name, param)
|
||||
player_notes.mgr[name] = { indx={}, data="", note={}, key="" }
|
||||
minetest.show_formspec(name, "player_notes:conf", player_notes.get_formspec(0, name))
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player,formname,fields)
|
||||
if formname ~= "player_notes:conf" then
|
||||
return
|
||||
end
|
||||
local player_name = player:get_player_name()
|
||||
if fields.quit then -- exit
|
||||
if player_notes.mgr[player_name] then
|
||||
player_notes.mgr[player_name] = nil
|
||||
end
|
||||
return
|
||||
end
|
||||
if not player_notes.mgr[player_name] then
|
||||
return
|
||||
end
|
||||
if not minetest.check_player_privs(player_name, {player_notes=true}) then
|
||||
return
|
||||
end
|
||||
if fields.close then -- exit to main
|
||||
minetest.show_formspec(player_name, "player_notes:conf", player_notes.get_formspec(0, player_name))
|
||||
return
|
||||
end
|
||||
if fields.m_all then -- list-click-event
|
||||
local selected_player = ""
|
||||
local event = minetest.explode_textlist_event(fields.m_all)
|
||||
if event.type == "CHG" then
|
||||
selected_player = player_notes.mgr[player_name].indx[event.index]
|
||||
end
|
||||
player_notes.mgr[player_name].data = selected_player
|
||||
minetest.show_formspec(player_name, "player_notes:conf", player_notes.get_formspec(0, player_name))
|
||||
return
|
||||
end
|
||||
if fields.p_all then -- list-click-event
|
||||
local selected_note = ""
|
||||
local event = minetest.explode_textlist_event(fields.p_all)
|
||||
if event.type == "CHG" then
|
||||
selected_note = tostring(player_notes.mgr[player_name].note[event.index])
|
||||
end
|
||||
player_notes.mgr[player_name].key = selected_note
|
||||
minetest.show_formspec(player_name, "player_notes:conf", player_notes.get_formspec(2, player_name))
|
||||
return
|
||||
end
|
||||
if fields.m_add and fields.p_name then -- show adding formspec
|
||||
if not minetest.auth_table[fields.p_name] then
|
||||
minetest.chat_send_player(player_name, "Unknown player: "..fields.p_name)
|
||||
return
|
||||
end
|
||||
player_notes.mgr[player_name].data = fields.p_name
|
||||
minetest.show_formspec(player_name, "player_notes:conf", player_notes.get_formspec(1, player_name))
|
||||
return
|
||||
end
|
||||
if fields.m_rm then -- show removing formspec
|
||||
if not player_notes.player[player_notes.mgr[player_name].data] then
|
||||
minetest.chat_send_player(player_name, "Please select a player name.")
|
||||
return
|
||||
end
|
||||
minetest.show_formspec(player_name, "player_notes:conf", player_notes.get_formspec(2, player_name))
|
||||
return
|
||||
end
|
||||
if fields.m_so then -- show player notes only
|
||||
if not player_notes.player[player_notes.mgr[player_name].data] then
|
||||
minetest.chat_send_player(player_name, "Please select a player name.")
|
||||
return
|
||||
end
|
||||
minetest.show_formspec(player_name, "player_notes:conf", player_notes.get_formspec(3, player_name))
|
||||
return
|
||||
end
|
||||
|
||||
if fields.p_add and fields.p_name and fields.p_note then -- add note
|
||||
local back_err = player_notes.add_note(player_name, fields.p_name, fields.p_note)
|
||||
if not back_err then
|
||||
minetest.chat_send_player(player_name, "Added note!")
|
||||
player_notes.save_data()
|
||||
else
|
||||
minetest.chat_send_player(player_name, back_err)
|
||||
end
|
||||
return
|
||||
end
|
||||
if fields.p_rm and fields.p_key then -- ReMove note
|
||||
local back_err = player_notes.rm_note(player_notes.mgr[player_name].data, fields.p_key)
|
||||
if not back_err then
|
||||
minetest.chat_send_player(player_name, "Removed note!")
|
||||
player_notes.save_data()
|
||||
else
|
||||
minetest.chat_send_player(player_name, back_err)
|
||||
end
|
||||
minetest.show_formspec(player_name, "player_notes:conf", player_notes.get_formspec(2, player_name))
|
||||
end
|
||||
end)
|
||||
|
||||
function player_notes.get_formspec(mode, player_name)
|
||||
local formspec = ""
|
||||
if mode == 0 then
|
||||
--main formspec
|
||||
formspec = ("size[5,8]"..
|
||||
"label[1,0;Player note manager]"..
|
||||
"field[0.3,7.2;5,0.5;p_name;;"..player_notes.mgr[player_name].data.."]"..
|
||||
"button_exit[1,7.5;3,1;exit;Close]"..
|
||||
"textlist[0,0.5;4,6;m_all;")
|
||||
player_notes.mgr[player_name].indx = {}
|
||||
local i = 1
|
||||
for player, notes in pairs(player_notes.player) do
|
||||
local num = 0
|
||||
for key, note in pairs(notes) do
|
||||
num = num + 1
|
||||
end
|
||||
formspec = formspec..player.." ("..tostring(num)..")"..","
|
||||
player_notes.mgr[player_name].indx[i] = player
|
||||
i = i + 1
|
||||
end
|
||||
player_notes.mgr[player_name].indx[i] = ""
|
||||
formspec = (formspec..";;false]"..
|
||||
"button[4.2,2;1,1;m_add;+]"..
|
||||
"button[4.2,3;1,1;m_so;?]"..
|
||||
"button[4.2,4;1,1;m_rm;-]")
|
||||
elseif mode == 1 then
|
||||
--player add note
|
||||
formspec = ("size[7,4]"..
|
||||
"label[1,0;Add a player note]"..
|
||||
"field[0.5,1.5;4,0.5;p_name;Player name:;"..player_notes.mgr[player_name].data.."]"..
|
||||
"field[0.5,3;6,0.5;p_note;Note text:;]"..
|
||||
"button[1,3.5;2,1;p_add;Add]"..
|
||||
"button[3,3.5;2,1;close;Close]")
|
||||
elseif mode == 2 then
|
||||
--player remove note
|
||||
formspec = ("size[10,6]"..
|
||||
"label[1,0;Remove a player note]"..
|
||||
"label[0,0.6;Key:]"..
|
||||
"field[1,1;3,0.5;p_key;;"..player_notes.mgr[player_name].key.."]"..
|
||||
"button[3.6,0.5;2,1;p_rm;Remove]"..
|
||||
"button[5.6,0.5;2,1;close;Close]"..
|
||||
"textlist[0,1.5;9.8,4.8;p_all;")
|
||||
player_notes.mgr[player_name].note = {}
|
||||
local i = 1
|
||||
if player_notes.player[player_notes.mgr[player_name].data] then
|
||||
for key, note in pairs(player_notes.player[player_notes.mgr[player_name].data]) do
|
||||
formspec = formspec..key.." - "..minetest.formspec_escape(note)..","
|
||||
player_notes.mgr[player_name].note[i] = key
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
player_notes.mgr[player_name].note[i] = ""
|
||||
formspec = formspec..";;false]"
|
||||
elseif mode == 3 then
|
||||
formspec = ("size[10,5]"..
|
||||
"label[1,0;Notes of: "..player_notes.mgr[player_name].data.."]"..
|
||||
"button[3.5,4.5;3,1;close;Close]"..
|
||||
"textlist[0,0;9.8,4.5;p_see;")
|
||||
player_notes.mgr[player_name].note = {}
|
||||
if player_notes.player[player_notes.mgr[player_name].data] then
|
||||
for key, note in pairs(player_notes.player[player_notes.mgr[player_name].data]) do
|
||||
formspec = formspec..minetest.formspec_escape(note)..","
|
||||
end
|
||||
end
|
||||
formspec = formspec..";;false]"
|
||||
end
|
||||
return formspec
|
||||
end
|
Reference in New Issue
Block a user