party_api: add support for partys that require invite

This commit is contained in:
tour 2025-04-06 18:10:59 +02:00
parent aa308408bc
commit 9725c71e96
7 changed files with 170 additions and 4 deletions

View File

@ -1,5 +1,6 @@
std = "lua51+luajit+minetest"
-- pattern local res1, error = f1(); if not res1 then return false, error end; local res2, error = f2()
ignore = {"411"}
globals = {"party_api", "party", "factions"}

View File

@ -0,0 +1,45 @@
local InvitePartyManager = {}
local super = party_api.manager_classes.default_manager
local __index = function (_, key)
return InvitePartyManager[key] or super[key]
end
InvitePartyManager.setInvite = function (self, partyname, value)
local party, error = self:getParty(partyname)
if not party then return false, error end
local success, error = party:setInviteRequired(value)
if not success then return false, error end
self:setParty(party)
return success
end
InvitePartyManager.invite = function (self, playername, partyname)
local party, error = self:getParty(partyname)
if not party then return false, error end
local sucess, error = party:invite(playername)
if not sucess then return false, error end
self:setParty(party)
return "OK"
end
InvitePartyManager.cancelInvite = function (self, playername, partyname)
local party, error = self:getParty(partyname)
if not party then return false, error end
local sucess, error = party:cancelInvite(playername)
if not sucess then return false, error end
self:setParty(party)
return "OK"
end
local call = function (_, ...)
local manager = super(...)
return setmetatable(manager, {__index = __index})
end
return setmetatable({}, {
__call = call,
__index = __index,
})

View File

@ -0,0 +1,93 @@
local core = minetest
-- core.write_json / core.parse_json has problems when called on {}
local serialize = core.serialize
local deserialize = core.deserialize
local InviteParty = {}
local super = party_api.party_classes.default_party
local __index = function (_, key)
return InviteParty[key] or super[key]
end
InviteParty.getData = function(self)
local result = super.getData(self)
result.invite_required = self.invite_required
result.invited = self.invited
return result
end
InviteParty.join = function (self, playername)
if self.invite_required then
local invite_list = deserialize(self.invited)
if not invite_list[playername] then
-- TODO: Notify that someone wanted to join?)
return false, "Missing invitation for this party"
end
invite_list[playername] = nil
self.invited = serialize(invite_list)
end
return super.join(self, playername)
end
InviteParty.setInviteRequired = function (self, value)
-- turn value into a bool
value = not not value
self.invite_required = value
if value == false then
party.invited = serialize({})
return "Invite is now OFF"
else
return "Invite is now ON"
end
end
InviteParty.invite = function (self, playername)
if not self.invite_required then
return false, "No invite required"
end
local invite_list = deserialize(self.invited)
invite_list[playername] = true
self.invited = serialize(invite_list)
return "OK"
end
InviteParty.cancelInvite = function (self, playername)
if not self.invite_required then
return false, "No invite required"
end
local invite_list = deserialize(self.invited)
invite_list[playername] = nil
self.invited = serialize(invite_list)
return "OK"
end
local load = function (partyname, data, members)
local party = super(partyname, data, members)
party.invite_required = data.invite_required
party.invited = data.invited
return setmetatable(party, {__index = __index})
end
local create = function(partyname, invite_required)
local party = super(partyname)
-- turn invite_required into a bool
party.invite_required = not not invite_required
party.invited = serialize({})
return setmetatable(party, {__index = __index})
end
local call = function (_, ...)
if #{...} < 3 then return create(...) end
if #{...} == 3 then return load(...) end
end
return setmetatable({}, {
__call = call,
__index = __index,
})

View File

@ -158,7 +158,7 @@ end
-- -----------------------------------------------------------------------------------------------------------------
return function (kwargs)
local call = function (_, kwargs)
if kwargs.storage_ref:get_string("partylist") == "" then
kwargs.storage_ref:set_string("partylist", serialize({}))
end
@ -166,4 +166,9 @@ return function (kwargs)
storage_ref = kwargs.storage_ref,
party_class = kwargs.party_class,
}, metatable)
end
end
return setmetatable({}, {
__call = call,
__index = PartyManager,
})

View File

@ -59,6 +59,13 @@ PartyObject.getPlayerData = function (self, playername)
return deserialize(self.members[playername])
end
PartyObject.setPlayerData = function (self, playername, data)
if not self.members[playername] then
return false, "player is not part of the party"
end
self.members[playername] = serialize(data)
return "OK"
end
local load = function (partyname, data, members)
local party = table.copy(data)
@ -76,7 +83,7 @@ local create = function(partyname)
end
local call = function (_, ...)
if #{...} == 1 then return create(...) end
if #{...} < 3 then return create(...) end
if #{...} == 3 then return load(...) end
end

View File

@ -16,6 +16,12 @@
- leave(playername)
### PartyObject
**data**
- name
- created
- members (structure: see above)
**functions**
- (partyname): creates a new party with the given name
- (partyname, data, members): loads a party with the given params
- getName()
@ -25,4 +31,10 @@
- rename(newname)
- join(playername)
- leave(playername)
- getPlayerData(playername)
- getPlayerData(playername)
- setPlayerData(playername, data)
### InvitePartyObject (additional to PartyObject)
**data**
- invite_required (bool)
- invited: serialized table in the form of members

View File

@ -11,4 +11,7 @@ party_api.manager_classes = {}
party_api.party_classes = {}
party_api.manager_classes.default_manager = dofile(party_api.modpath .. "/PartyManager.lua")
party_api.manager_classes.invite_manager = dofile(party_api.modpath .. "/InvitePartyManager.lua")
party_api.party_classes.default_party = dofile(party_api.modpath .. "/PartyObject.lua")
party_api.party_classes.invite_party = dofile(party_api.modpath .. "/InvitePartyObject.lua")