Initial commit
This commit is contained in:
commit
c5ce15e145
|
@ -0,0 +1,21 @@
|
||||||
|
# MIT License
|
||||||
|
|
||||||
|
*Copyright © 2018 by luk3yx*
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,22 @@
|
||||||
|
# Wireless touchscreens
|
||||||
|
|
||||||
|
A Minetest mod that adds wireless digistuff touchscreens, inspired by
|
||||||
|
[digitouch].
|
||||||
|
|
||||||
|
[digitouch]: https://gitlab.com/rdococ/digitouch
|
||||||
|
|
||||||
|
## Crafting
|
||||||
|
|
||||||
|
To craft a wireless touchscreen, use a regular touchscreen, a teleportation tube
|
||||||
|
(mese block if pipeworks isn't installed) and a diamond.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
This mod depends on `digistuff` and `digilines`.
|
||||||
|
|
||||||
|
The following optional dependencies may exist:
|
||||||
|
- `default`: Crafting recipes.
|
||||||
|
- `pipeworks`: Optional crafting recipe change.
|
||||||
|
- `scriptblocks`: Not required at all, however when `scriptblocks` is loaded
|
||||||
|
this mod will use a scriptblocks API function instead of its own to
|
||||||
|
save memory.
|
|
@ -0,0 +1,5 @@
|
||||||
|
digilines
|
||||||
|
digistuff
|
||||||
|
scriptblocks?
|
||||||
|
pipeworks?
|
||||||
|
default?
|
|
@ -0,0 +1,192 @@
|
||||||
|
--
|
||||||
|
-- Minetest wireless touchscreens mod
|
||||||
|
--
|
||||||
|
|
||||||
|
wireless_touchscreens = {}
|
||||||
|
local storage = minetest.get_mod_storage()
|
||||||
|
|
||||||
|
-- Node protection checking, copied from scriptblocks.
|
||||||
|
if minetest.get_modpath('scriptblocks') then
|
||||||
|
wireless_touchscreens.check_protection = scriptblocks.check_protection
|
||||||
|
else
|
||||||
|
wireless_touchscreens.check_protection = function(pos, name)
|
||||||
|
if type(name) ~= 'string' then
|
||||||
|
name = name:get_player_name()
|
||||||
|
end
|
||||||
|
|
||||||
|
if minetest.is_protected(pos, name) and
|
||||||
|
not minetest.check_player_privs(name, {protection_bypass=true}) then
|
||||||
|
minetest.record_protection_violation(pos, name)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Allowed touchscreens
|
||||||
|
wireless_touchscreens.parents = {}
|
||||||
|
wireless_touchscreens.screens = {}
|
||||||
|
|
||||||
|
-- Override formspec updates
|
||||||
|
wireless_touchscreens.update_ts_formspec = digistuff.update_ts_formspec
|
||||||
|
digistuff.update_ts_formspec = function(pos, ...)
|
||||||
|
wireless_touchscreens.update_ts_formspec(pos, ...)
|
||||||
|
|
||||||
|
local spos = minetest.pos_to_string(pos)
|
||||||
|
|
||||||
|
local nodes = storage:get_string(spos)
|
||||||
|
if not nodes or #nodes < 5 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local save = false
|
||||||
|
local any = false
|
||||||
|
|
||||||
|
nodes = minetest.deserialize(nodes)
|
||||||
|
local formspec = minetest.get_meta(pos):get_string('formspec')
|
||||||
|
|
||||||
|
-- Update the nodes
|
||||||
|
for node, _ in pairs(nodes) do
|
||||||
|
any = true
|
||||||
|
local remote = minetest.string_to_pos(node)
|
||||||
|
local name = minetest.get_node(remote).name
|
||||||
|
if _ and wireless_touchscreens.screens[name] then
|
||||||
|
local meta = minetest.get_meta(remote)
|
||||||
|
local owner, r = meta:get_string('owner'), meta:get_string('remote')
|
||||||
|
if r ~= spos or
|
||||||
|
wireless_touchscreens.check_protection(remote, owner) then
|
||||||
|
wireless_touchscreens.on_construct(remote)
|
||||||
|
nodes[node] = nil
|
||||||
|
save = true
|
||||||
|
else
|
||||||
|
meta:set_string('formspec', formspec)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not any then
|
||||||
|
minetest.forceload_free_block(remote, true)
|
||||||
|
storage:set_string(spos, '')
|
||||||
|
elseif save then
|
||||||
|
storage:set_string(spos, minetest.serialize(nodes))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Node handlers
|
||||||
|
wireless_touchscreens.on_construct = function(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_string('formspec', 'field[remote;Remote touchscreen position;]')
|
||||||
|
meta:set_string('owner', '')
|
||||||
|
meta:set_string('remote', '')
|
||||||
|
end
|
||||||
|
|
||||||
|
wireless_touchscreens.on_receive_fields = function(pos,formname,fields,sender)
|
||||||
|
local victim = sender:get_player_name()
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local remote = meta:get_string('remote')
|
||||||
|
local owner = meta:get_string('owner')
|
||||||
|
|
||||||
|
if remote then remote = minetest.string_to_pos(remote) end
|
||||||
|
|
||||||
|
-- Forward fields onto digistuff if the touchscreen protection hasn't
|
||||||
|
-- changed
|
||||||
|
if remote and owner then
|
||||||
|
minetest.forceload_block(remote, true)
|
||||||
|
if minetest.is_protected(remote, owner) or not
|
||||||
|
wireless_touchscreens.parents[minetest.get_node(remote).name]
|
||||||
|
then
|
||||||
|
minetest.forceload_free_block(remote, true)
|
||||||
|
storage:set_string(minetest.pos_to_string(remote), '')
|
||||||
|
-- TODO: Make this close_formspec more specific.
|
||||||
|
minetest.close_formspec(victim, '')
|
||||||
|
minetest.chat_send_player(victim,
|
||||||
|
'The remote touchscreen is no longer accessible!')
|
||||||
|
wireless_touchscreens.on_construct(pos)
|
||||||
|
else
|
||||||
|
digistuff.ts_on_receive_fields(remote, formname, fields, sender)
|
||||||
|
end
|
||||||
|
return
|
||||||
|
elseif wireless_touchscreens.check_protection(pos, victim) or
|
||||||
|
not fields.remote then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
remote = minetest.string_to_pos(fields.remote)
|
||||||
|
|
||||||
|
if not remote then
|
||||||
|
return minetest.chat_send_player(victim, 'Invalid position!')
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.forceload_block(remote, true)
|
||||||
|
|
||||||
|
local name = minetest.get_node(remote).name
|
||||||
|
if wireless_touchscreens.check_protection(remote, victim) then
|
||||||
|
return minetest.forceload_free_block(remote, true)
|
||||||
|
elseif not wireless_touchscreens.parents[name] then
|
||||||
|
minetest.chat_send_player(victim, 'That block is not a touchscreen!')
|
||||||
|
return minetest.forceload_free_block(remote, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
local sremote = minetest.pos_to_string(remote)
|
||||||
|
meta:set_string('remote', sremote)
|
||||||
|
meta:set_string('owner', victim)
|
||||||
|
|
||||||
|
-- Add the touchscreen to the list to update
|
||||||
|
local data = storage:get_string(sremote)
|
||||||
|
if data and #data > 5 then
|
||||||
|
data = minetest.deserialize(data)
|
||||||
|
else
|
||||||
|
data = {}
|
||||||
|
end
|
||||||
|
data[minetest.pos_to_string(pos)] = true
|
||||||
|
storage:set_string(sremote, minetest.serialize(data))
|
||||||
|
|
||||||
|
-- Make the remote touchscreen updated.
|
||||||
|
meta:set_string('formspec',
|
||||||
|
minetest.get_meta(remote):get_string('formspec'))
|
||||||
|
|
||||||
|
minetest.chat_send_player(victim, 'Remote touchscreen set!')
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Register a wireless node
|
||||||
|
wireless_touchscreens.register_node = function(name, parent, texture_overlay)
|
||||||
|
local def2 = minetest.registered_nodes[parent]
|
||||||
|
if not def2 then error('Node ' .. parent .. ' does not exist!') end
|
||||||
|
local def = {}
|
||||||
|
|
||||||
|
for key, value in pairs(def2) do
|
||||||
|
def[key] = value
|
||||||
|
end
|
||||||
|
|
||||||
|
def.name = nil
|
||||||
|
def.digiline = nil
|
||||||
|
def.description = 'Wireless ' .. def.description
|
||||||
|
def.on_construct = wireless_touchscreens.on_construct
|
||||||
|
def.on_receive_fields = wireless_touchscreens.on_receive_fields
|
||||||
|
texture_overlay = texture_overlay or '^[colorize:#24f2'
|
||||||
|
|
||||||
|
wireless_touchscreens.parents[parent] = true
|
||||||
|
wireless_touchscreens.screens[name] = true
|
||||||
|
|
||||||
|
for n, tile in ipairs(def.tiles) do
|
||||||
|
def.tiles[n] = tile .. texture_overlay
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_node(name, def)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Create the node
|
||||||
|
wireless_touchscreens.register_node('wireless_touchscreens:ts',
|
||||||
|
'digistuff:touchscreen')
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = 'wireless_touchscreens:ts',
|
||||||
|
type = 'shapeless',
|
||||||
|
recipe = {
|
||||||
|
'digistuff:touchscreen',
|
||||||
|
minetest.get_modpath('pipeworks') and 'pipeworks:teleport_tube_1'
|
||||||
|
or 'default:mese',
|
||||||
|
'default:diamond'
|
||||||
|
}
|
||||||
|
})
|
Loading…
Reference in New Issue