Add version 1 fix #1

master
Louis Royer 2020-07-15 18:02:14 +02:00
parent 1900387937
commit 69249b01f8
9 changed files with 407 additions and 0 deletions

233
craft_common.lua Normal file
View File

@ -0,0 +1,233 @@
-- Translation support
local S = minetest.get_translator("virtual_key")
local DS = minetest.get_translator("default")
local KS = minetest.get_translator("keyring")
virtual_key.craft_common = {}
virtual_key.craft_common.base_form_def = {
translator = S,
title_tab_management = S("Virtual keys management"),
title_tab_settings = S("Registerer settings"),
virtual_symbol = "", -- all keys are virtual, no need to print this
msg_not_allowed_edit = S("You are not allowed to edit settings of this registerer."),
msg_is_public = S("This registerer is public."),
msg_you_own = S("You own this registerer."),
msg_is_owned_by = "This registerer is owned by @1.",
msg_is_shared_with = S("This registerer is shared with:"),
msg_not_use_allowed = S("You are not allowed to use this registerer."),
msg_not_shared = S("This registerer is not shared."),
msg_list_of_keys = S("List of virtual keys in the registerer:"),
msg_no_key = S("There is no virtual key in the registerer."),
remove_key = true,
rename_key = true,
set_owner = true,
share = false,
}
--[[
-- Adds a virtual key to a registerer. There is no owning check in this function.
--]]
virtual_key.craft_common.import_virtual_key = function(itemstack,
secret, description, user_desc)
local meta = itemstack:get_meta()
local krs = minetest.deserialize(meta:get_string(keyring.fields.KRS)) or {}
if not keyring.fields.utils.KRS.in_keyring(krs, secret) then
krs[secret] = {
number = 0,
virtual = true,
description = description,
user_description = user_desc or nil,
}
meta:set_string(keyring.fields.KRS, minetest.serialize(krs))
end
return itemstack
end
virtual_key.craft_common.base_craft_def = {
inventory_image = "virtual_key_virtual_keys_registerer.png",
-- mimic a key
groups = {virtual_key = 1, key_container = 1},
stack_max = 1,
-- on left click
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
local pos = pointed_thing.under
local node = minetest.get_node(pos)
if not node then
return itemstack
end
local on_skeleton_key_use = minetest.registered_nodes[node.name].on_skeleton_key_use
if not on_skeleton_key_use then
return itemstack
end
local name = user:get_player_name()
local keyring_owner = itemstack:get_meta():get_string("owner")
local keyring_access = keyring.fields.utils.owner.is_edit_allowed(keyring_owner, name)
if not keyring_access then
virtual_key.log("action", "Player "..name
.." tryed to use personal virtual keys registerer of "
..(keyring_owner or "unkwown player"))
minetest.chat_send_player(name,
S("You are not allowed to use this personal virtual keys registerer."))
return itemstack
end
-- make a new key secret in case the node callback needs it
local random = math.random
local newsecret = string.format(
"%04x%04x%04x%04x",
random(2^16) - 1, random(2^16) - 1,
random(2^16) - 1, random(2^16) - 1)
local secret, _, _ = on_skeleton_key_use(pos, user, newsecret)
if secret then
-- add virtual key
return virtual_key.craft_common.import_virtual_key(itemstack, secret,
DS("Key to @1's @2", name, minetest.registered_nodes[node.name].description))
end
return itemstack
end,
on_secondary_use = function(itemstack, placer, pointed_thing)
return keyring.form.formspec(itemstack, placer)
end,
-- mod doc
_doc_items_usagehelp = S("Use it like a regular skeleton key. "
.."Click pointing no node to access virtual-key-management interface "
.."(keys can be renamed or removed).\n"
.."To use your registered virtual keys, add them to a keyring."),
}
--[[
-- Returns a table with:
-- - consumme
-- - is_craft_forbidden
-- - is_result_owned
-- - return_list
-- - result_name
--]]
virtual_key.craft_common.get_craft_properties = function(itemstack, player_name,
old_craft_grid)
local props = {
consumme = false,
is_craft_forbidden = false,
is_result_owned = false,
return_list = {},
result_name = itemstack:get_name(),
}
for position, item in pairs(old_craft_grid) do
local item_name = item:get_name()
if item_name == "basic_materials:padlock" then
props.consumme = true
end
local owner = item:get_meta():get_string("owner")
if owner ~= "" then
props.is_craft_forbidden = not keyring.fields.utils.owner.is_edit_allowed(owner,
player_name)
if props.is_craft_forbidden then
return props
end
if props.result_name == item_name then
props.is_result_owned = true
end
end
if minetest.get_item_group(item_name, "virtual_key") == 1 then
table.insert(props.return_list, position, item)
end
end
for position, item in pairs(props.return_list) do
local item_name = item:get_name()
if (props.consumme and (minetest.get_item_group(item_name, "virtual_key") == 1))
or (item_name == props.result_name
and props.is_result_owned == (item:get_meta():get_string("owner") ~= "")) then
props.return_list[position] = nil
break
end
end
return props
end
-- manage virtual keys copy
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
local name = itemstack:get_name()
-- guard
if (name ~= "virtual_key:virtual_keys_registerer")
and (name ~= "virtual_key:personal_virtual_keys_registerer") then
return
end
local play_name = player:get_player_name()
local properties = virtual_key.craft_common.get_craft_properties(itemstack,
play_name, old_craft_grid)
if properties.is_craft_forbidden then
virtual_key.log("action", "Player "..play_name.." used a virtual key owned by "
.."an other player in a craft")
for p, i in pairs(old_craft_grid) do
craft_inv:set_stack("craft", p, i)
end
return ItemStack(nil)
end
-- merge virtual keys in 1 KRS
local r_krs = {}
for p, i in pairs(old_craft_grid) do
print(dump(i))
if minetest.get_item_group(i:get_name(), "virtual_key") == 1 then
local meta = i:get_meta()
local krs = minetest.deserialize(meta:get_string(keyring.fields.KRS)) or {}
for s, vk in pairs(krs) do
r_krs[s] = vk
end
end
end
-- resulting krs
local ser_r_krs = minetest.serialize(r_krs)
itemstack:get_meta():set_string(keyring.fields.KRS, ser_r_krs)
-- set back return_list
for p, i in pairs(properties.return_list) do
i:get_meta():set_string(keyring.fields.KRS, ser_r_krs)
craft_inv:set_stack("craft", p, i)
end
if properties.consumme then
return itemstack
end
if not properties.is_result_owned then
return itemstack
end
local meta = itemstack:get_meta()
meta:set_string("description", itemstack:get_description()
.." "..KS("(owned by @1)", play_name))
meta:set_string("owner", play_name)
return itemstack
end)
-- craft predictions
minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv)
local name = itemstack:get_name()
if (name ~= "virtual_key:virtual_keys_registerer")
and (name ~= "virtual_key:personal_virtual_keys_registerer") then
return
end
local play_name = player:get_player_name()
local properties = virtual_key.craft_common.get_craft_properties(itemstack,
play_name, old_craft_grid)
if properties.is_craft_forbidden then
return ItemStack(nil)
end
if properties.consumme or (not properties.is_result_owned) then
return
end
local meta = itemstack:get_meta()
meta:set_string("description", itemstack:get_description()
.." "..KS("(owned by @1)", play_name))
meta:set_string("owner", play_name)
return itemstack
end)

View File

@ -0,0 +1,37 @@
-- Translation support
local S = minetest.get_translator("virtual_key")
local form_def = {}
for k, v in pairs(virtual_key.craft_common.base_form_def) do
form_def[k] = v
end
form_def.title_tab = true
keyring.form.register_allowed("virtual_key:personal_virtual_keys_registerer", form_def)
local def = {}
for k, v in pairs(virtual_key.craft_common.base_craft_def) do
def[k] = v
end
def.description = S("Personal virtual keys registerer")
def._doc_items_longdesc = S("A personal virtual keys registerer to "
.."register your virtual keys.")
minetest.register_craftitem("virtual_key:personal_virtual_keys_registerer", def)
minetest.register_craft({
output = "virtual_key:personal_virtual_keys_registerer",
recipe = { "default:skeleton_key", "basic_materials:ic", "basic_materials:padlock" },
type = "shapeless",
})
minetest.register_craft({
output = "virtual_key:personal_virtual_keys_registerer",
recipe = { "virtual_key:virtual_keys_registerer", "basic_materials:padlock" },
type = "shapeless",
})
-- craft to synchronize virtual keys
minetest.register_craft({
output = "virtual_key:personal_virtual_keys_registerer",
recipe = { "virtual_key:personal_virtual_keys_registerer", "group:virtual_key" },
type = "shapeless",
})

View File

@ -0,0 +1,28 @@
-- Translation support
local S = minetest.get_translator("virtual_key")
keyring.form.register_allowed("virtual_key:virtual_keys_registerer",
virtual_key.craft_common.base_form_def)
local def = {}
for k, v in pairs(virtual_key.craft_common.base_craft_def) do
def[k] = v
end
def.description = S("Virtual keys registerer")
def._doc_items_longdesc = S("A virtual keys registerer to "
.."register your virtual keys.")
minetest.register_craftitem("virtual_key:virtual_keys_registerer", def)
minetest.register_craft({
output = "virtual_key:virtual_keys_registerer",
recipe = { "default:skeleton_key", "basic_materials:ic" },
type = "shapeless",
})
-- craft to synchronize virtual keys
minetest.register_craft({
output = "virtual_key:virtual_keys_registerer",
recipe = { "virtual_key:virtual_keys_registerer", "group:virtual_key" },
type = "shapeless",
})

44
init.lua Normal file
View File

@ -0,0 +1,44 @@
local MP = minetest.get_modpath("virtual_key")
virtual_key = {}
-- mod information
virtual_key.mod = {version = "1.0.0", author = "Louis Royer"}
-- virtual_key settings
virtual_key.settings =
{
personal_vkeys_registerer = minetest.settings:get_bool(
"virtual_key.personal_vkeys_registerer", true),
}
-- XXX: when https://github.com/minetest/minetest/pull/7377
-- is merged, we can remove this function and %s/virtual_key\.log/minetest\.log/g
virtual_key.log = function(level, text)
local prefix = "[virtual_key] "
if text then
minetest.log(level, prefix..text)
else
minetest.log(prefix..level)
end
end
local keyring_version = {}
local k = 1
for v in string.gmatch(keyring.mod.version, "[^%.]+") do
keyring_version[k] = tonumber(v)
k = k + 1
end
if (keyring_version[1] < 1) and (keyring_version[2] < 2) then
-- keyring version must be at least 1.2.0
virtual_key.log("error", "Please use a more recent version of"
.." keyring to be able to add your virtual keys to keyrings.")
virtual_key.log("error", "Get lastest version of keyring: "
.."https://github.com/louisroyer/minetest-keyring/releases/latest")
end
dofile(MP.."/craft_common.lua")
dofile(MP.."/craft_virtual_keys_registerer.lua")
if virtual_key.settings.personal_vkeys_registerer then
dofile(MP.."/craft_personal_virtual_keys_registerer.lua")
end

32
locale/template.txt Normal file
View File

@ -0,0 +1,32 @@
# textdomain: virtual_key
### craft_common.lua ###
List of virtual keys in the registerer:=
Registerer settings=
There is no virtual key in the registerer.=
This registerer is not shared.=
This registerer is public.=
This registerer is shared with:=
Use it like a regular skeleton key. Click pointing no node to access virtual-key-management interface (keys can be renamed or removed).@nTo use your registered virtual keys, add them to a keyring.=
Virtual keys management=
You are not allowed to edit settings of this registerer.=
You are not allowed to use this personal virtual keys registerer.=
You are not allowed to use this registerer.=
You own this registerer.=
### craft_personal_virtual_keys_registerer.lua ###
A personal virtual keys registerer to register your virtual keys.=
Personal virtual keys registerer=
### craft_virtual_keys_registerer.lua ###
A virtual keys registerer to register your virtual keys.=
Virtual keys registerer=

32
locale/virtual_key.fr.tr Normal file
View File

@ -0,0 +1,32 @@
# textdomain: virtual_key
### craft_common.lua ###
List of virtual keys in the registerer:=Liste des clés virtuelles dans lenregistreur :
Registerer settings=Paramètres de lenregistreur
There is no virtual key in the registerer.=Il ny a pas de clé virtuelle dans lenregistreur.
This registerer is not shared.=Lenregistreur nest pas partagé.
This registerer is public.=Lenregistreur est public.
This registerer is shared with:=Lenregistreur est partagé avec :
Use it like a regular skeleton key. Click pointing no node to access virtual-key-management interface (keys can be renamed or removed).@nTo use your registered virtual keys, add them to a keyring.=Utilisez-le comme un squelette de clé classique. Cliquez sans viser de bloc pour accéder à linterface de gestion de clés virtuelles (les clés peuvent être renommées ou supprimées).@nPour utiliser les clés virtuelles enregistrées, ajoutez les à un trousseau.
Virtual keys management=Gestion des clés virtuelles
You are not allowed to edit settings of this registerer.=Vous nêtes pas autorisé à modifier les paramètres de lenregistreur.
You are not allowed to use this personal virtual keys registerer.=Vouns nêtes pas autorisé à utiliser cet enregistreur personnel de clés virtuelles.
You are not allowed to use this registerer.=Vous nêtes pas autorisé à utiliser cet enregistreur.
You own this registerer.=Vous possédez cet enregistreur.
### craft_personal_virtual_keys_registerer.lua ###
A personal virtual keys registerer to register your virtual keys.=Un enregistreur personnel de clés virtuelles pour enregistrer vos clés virtuelles.
Personal virtual keys registerer=Enregistreur personnel de clés virtuelles
### craft_virtual_keys_registerer.lua ###
A virtual keys registerer to register your virtual keys.=Un enregistreur de clés virtuelles pour enregistrer vos clés virtuelles.
Virtual keys registerer=Enregistreur de clés virtuelles

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

1
settingtypes.txt Normal file
View File

@ -0,0 +1 @@
virtual_key.personal_vkeys_registerer (Enable personal virtual keys registerer) bool true

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB