rolling-5
parent
5c0811155c
commit
6fbe6052a1
|
@ -14,6 +14,9 @@ Part of the Limit Series: [`item_limit`](https://github.com/appgurueu/item_limit
|
|||
* A bar appears showing you the time left, and after it's over (or if you switch again) the hidden items reappear
|
||||
* During switching you can only use your hand
|
||||
* Hidden items are not lost if the server crashes
|
||||
* `cycle_limit` priv allows evasion
|
||||
* Alternative mode works by granting/removing `interact`
|
||||
* To prevent players from having interact, revoke both `interact` and `interact_mods`
|
||||
|
||||
Known issues:
|
||||
|
||||
|
@ -42,10 +45,12 @@ Default configuration:
|
|||
{
|
||||
"name": "Switching",
|
||||
"duration": 2,
|
||||
"color": "545AA7"
|
||||
"color": "545AA7",
|
||||
"interact": false
|
||||
}
|
||||
```
|
||||
|
||||
* `name` is the timer name
|
||||
* `duration` is the time it takes to switch in seconds
|
||||
* `color` is a hex color (but without `#`)
|
||||
* `color` is a hex color (but without `#`)
|
||||
* `interact` is a boolean indicating whether the `interact` privilege should be revoked
|
|
@ -1,5 +1,6 @@
|
|||
{
|
||||
"name": "Switching",
|
||||
"duration": 2,
|
||||
"color": "545AA7"
|
||||
"color": "545AA7",
|
||||
"interact": true
|
||||
}
|
79
main.lua
79
main.lua
|
@ -7,10 +7,38 @@ config = modlib.conf.import("cycle_limit", {
|
|||
if not tonumber(num, 16) then
|
||||
return "Expected hex color"
|
||||
end
|
||||
end}
|
||||
end},
|
||||
interact = {type = "boolean"}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_privilege("cycle_limit", {
|
||||
description = "Not affected by cycle limit",
|
||||
give_to_singleplayer = false,
|
||||
give_to_admin = true
|
||||
})
|
||||
|
||||
local interact = config.interact
|
||||
|
||||
if interact then
|
||||
minetest.registered_privileges.interact.give_to_singleplayer = false
|
||||
minetest.register_privilege("interact_mods", {
|
||||
description = "Can be granted interact by mods",
|
||||
give_to_singleplayer = true,
|
||||
give_to_admin = true
|
||||
})
|
||||
function set_interact(player, value)
|
||||
if not minetest.check_player_privs(player, {interact_mods=true}) then
|
||||
return
|
||||
end
|
||||
local name = player:get_player_name()
|
||||
local privs = minetest.get_player_privs(name)
|
||||
privs.interact = value or nil
|
||||
minetest.set_player_privs(name, privs)
|
||||
privs = minetest.get_player_privs(name)
|
||||
end
|
||||
end
|
||||
|
||||
if config.duration == 0 then
|
||||
return
|
||||
end
|
||||
|
@ -18,7 +46,8 @@ end
|
|||
local players = {}
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
players[player:get_player_name()] = {
|
||||
local name = player:get_player_name()
|
||||
players[name] = {
|
||||
index = player:get_wield_index()
|
||||
}
|
||||
local meta = player:get_meta()
|
||||
|
@ -28,20 +57,40 @@ minetest.register_on_joinplayer(function(player)
|
|||
player:get_inventory():set_stack(player:get_wield_list(), taken[1], ItemStack(taken[2]))
|
||||
meta:set_string("cycle_limit_taken", "")
|
||||
end
|
||||
if interact then
|
||||
local privs = minetest.get_player_privs(name)
|
||||
if privs.interact or privs.interact_mods then
|
||||
if not privs.interact_mods then
|
||||
privs.interact_mods = true
|
||||
elseif not privs.interact then
|
||||
privs.interact = true
|
||||
end
|
||||
minetest.set_player_privs(name, privs)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
players[player:get_player_name()] = nil
|
||||
end)
|
||||
|
||||
minetest.register_globalstep(function()
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
local switching = players[player:get_player_name()]
|
||||
|
||||
if not minetest.check_player_privs(player, {cycle_limit=true}) then
|
||||
local name = player:get_player_name()
|
||||
local switching = players[name]
|
||||
local index = player:get_wield_index()
|
||||
if index ~= switching.index and index ~= switching.target_index then
|
||||
if switching.item then
|
||||
local inv = player:get_inventory()
|
||||
inv:set_stack(player:get_wield_list(), switching.target_index, switching.item)
|
||||
if not interact then
|
||||
inv:set_stack(player:get_wield_list(), switching.target_index, switching.item)
|
||||
end
|
||||
end
|
||||
switching.item = player:get_wielded_item()
|
||||
if switching.timer then
|
||||
hud_timers.remove_timer_by_reference(player:get_player_name(), switching.timer)
|
||||
hud_timers.remove_timer_by_reference(name, switching.timer)
|
||||
end
|
||||
switching.timer = hud_timers.add_timer(
|
||||
player:get_player_name(),
|
||||
|
@ -50,7 +99,15 @@ minetest.register_globalstep(function()
|
|||
duration = config.duration,
|
||||
color = config.color,
|
||||
on_complete = function()
|
||||
player:get_inventory():set_stack(player:get_wield_list(), switching.target_index, switching.item)
|
||||
-- player might have left in the meantime
|
||||
if not players[name] then
|
||||
return
|
||||
end
|
||||
if interact then
|
||||
set_interact(player, true)
|
||||
else
|
||||
player:get_inventory():set_stack(player:get_wield_list(), switching.target_index, switching.item)
|
||||
end
|
||||
switching.item = nil
|
||||
switching.timer = nil
|
||||
switching.index = switching.target_index
|
||||
|
@ -60,10 +117,16 @@ minetest.register_globalstep(function()
|
|||
end
|
||||
}
|
||||
)
|
||||
player:get_meta():set_string("cycle_limit_taken", minetest.write_json{index, switching.item:to_string()})
|
||||
player:set_wielded_item("")
|
||||
if interact then
|
||||
set_interact(player)
|
||||
else
|
||||
player:get_meta():set_string("cycle_limit_taken", minetest.write_json{index, switching.item:to_string()})
|
||||
player:set_wielded_item("")
|
||||
end
|
||||
player:hud_set_flags{wielditem = false}
|
||||
switching.target_index = index
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end)
|
Loading…
Reference in New Issue