forked from mtcontrib/scifi_nodes
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
fb1fdcf69e
17
.github/workflows/luacheck.yml
vendored
17
.github/workflows/luacheck.yml
vendored
@ -1,17 +1,10 @@
|
||||
name: luacheck
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
luacheck:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: apt
|
||||
run: sudo apt-get install -y luarocks
|
||||
- name: luacheck install
|
||||
run: luarocks install --local luacheck
|
||||
- name: luacheck run
|
||||
run: $HOME/.luarocks/bin/luacheck ./
|
||||
- name: Checkout
|
||||
uses: actions/checkout@main
|
||||
- name: Luacheck
|
||||
uses: lunarmodules/luacheck@master
|
13
.luacheckrc
13
.luacheckrc
@ -1,20 +1,14 @@
|
||||
std = "min+minetest"
|
||||
|
||||
unused_args = false
|
||||
max_line_length = 180
|
||||
|
||||
globals = {
|
||||
"scifi_nodes"
|
||||
}
|
||||
|
||||
read_globals = {
|
||||
-- Stdlib
|
||||
string = {fields = {"split"}},
|
||||
table = {fields = {"copy", "getn"}},
|
||||
|
||||
-- Minetest
|
||||
"vector", "ItemStack",
|
||||
"dump",
|
||||
|
||||
-- optional deps
|
||||
"advtrains",
|
||||
"default",
|
||||
"stairsplus",
|
||||
"xpanes",
|
||||
@ -23,6 +17,7 @@ read_globals = {
|
||||
"mesecon",
|
||||
"unifieddyes",
|
||||
"letters",
|
||||
"signs_api",
|
||||
"stealthnode",
|
||||
"slats",
|
||||
"mtt"
|
||||
|
@ -49,6 +49,9 @@ CC BY 3.0
|
||||
|
||||
CC0
|
||||
* scifi_nodes_digicode.ogg https://freesound.org/people/benjaminharveydesign/sounds/315921/
|
||||
* scifi_nodes_ambience_fan.ogg https://freesound.org/people/itinerantmonk108/sounds/554430/
|
||||
* scifi_nodes_ambience_vent.ogg https://freesound.org/people/kentspublicdomain/sounds/324665/
|
||||
* scifi_nodes_ambience_engine.ogg https://freesound.org/people/firestorm185/sounds/423221/
|
||||
|
||||
|
||||
# Contributors:
|
||||
|
259
access_card.lua
Normal file
259
access_card.lua
Normal file
@ -0,0 +1,259 @@
|
||||
local FORMSPEC_NAME = "scifi_nodes:access_card_configure"
|
||||
|
||||
local function create_id()
|
||||
local template = "xxxxxx"
|
||||
return string.gsub(template, '[x]', function ()
|
||||
return string.format('%x', math.random(0, 0xf))
|
||||
end)
|
||||
end
|
||||
|
||||
local function get_door_access_table(meta)
|
||||
local str = meta:get_string("access")
|
||||
if str == "" then
|
||||
-- no config
|
||||
return {}
|
||||
else
|
||||
return minetest.deserialize(str) or {}
|
||||
end
|
||||
end
|
||||
|
||||
local function set_door_access_table(meta, at)
|
||||
if next(at) then
|
||||
meta:set_string("access", minetest.serialize(at))
|
||||
else
|
||||
meta:set_string("access", "")
|
||||
end
|
||||
end
|
||||
|
||||
function scifi_nodes.door_check_access_card(node_pos, itemstack, player)
|
||||
local node_meta = minetest.get_meta(node_pos)
|
||||
local access_table = get_door_access_table(node_meta)
|
||||
if not next(access_table) then
|
||||
-- access not restricted
|
||||
return true
|
||||
end
|
||||
|
||||
if not minetest.is_player(player) then
|
||||
-- not a player, restrict access
|
||||
return false
|
||||
end
|
||||
|
||||
local playername = player:get_player_name()
|
||||
|
||||
if itemstack:get_name() ~= "scifi_nodes:access_card" then
|
||||
minetest.chat_send_player(playername, minetest.colorize("#ff0000", "Access denied: no access card detected!"))
|
||||
minetest.sound_play("scifi_nodes_scanner_refused", { pos = node_pos, max_hear_distance = 10 })
|
||||
return false
|
||||
end
|
||||
|
||||
local item_meta = itemstack:get_meta()
|
||||
local id = item_meta:get_string("id")
|
||||
if id == "" then
|
||||
minetest.chat_send_player(playername, minetest.colorize("#ff0000", "Access denied: unconfigured access card"))
|
||||
minetest.sound_play("scifi_nodes_scanner_refused", { pos = node_pos, max_hear_distance = 10 })
|
||||
return false
|
||||
end
|
||||
|
||||
if not access_table[id] then
|
||||
minetest.chat_send_player(playername, minetest.colorize("#ff0000", "Access denied: invalid access card"))
|
||||
minetest.sound_play("scifi_nodes_scanner_refused", { pos = node_pos, max_hear_distance = 10 })
|
||||
return false
|
||||
end
|
||||
|
||||
minetest.sound_play("scifi_nodes_scanner_granted", { pos = node_pos, max_hear_distance = 10 })
|
||||
return true
|
||||
end
|
||||
|
||||
-- using a card against a door toggles the access to it
|
||||
local function on_use(itemstack, player, pointed_thing)
|
||||
local playername = player:get_player_name()
|
||||
local pos = pointed_thing.under
|
||||
|
||||
if not pos then
|
||||
-- nothing selected
|
||||
return
|
||||
end
|
||||
|
||||
if minetest.is_protected(pos, playername) then
|
||||
-- protected
|
||||
return
|
||||
end
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
local node_def = minetest.registered_nodes[node.name]
|
||||
if not node_def.groups or not node_def.groups.scifi_nodes_door then
|
||||
-- incompatible node
|
||||
return
|
||||
end
|
||||
|
||||
local item_meta = itemstack:get_meta()
|
||||
local card_id = item_meta:get_string("id")
|
||||
if card_id == "" then
|
||||
minetest.chat_send_player(playername, "Access card is unconfigured")
|
||||
return
|
||||
end
|
||||
local card_name = item_meta:get_string("name")
|
||||
|
||||
local node_meta = minetest.get_meta(pos)
|
||||
local access_table = get_door_access_table(node_meta)
|
||||
|
||||
if access_table[card_id] then
|
||||
-- remove access
|
||||
access_table[card_id] = nil
|
||||
minetest.chat_send_player(playername, "Revoked access to card-id '" .. card_id .. "'")
|
||||
minetest.sound_play("scifi_nodes_scanner_refused", { pos = pos, max_hear_distance = 10 })
|
||||
else
|
||||
-- grant access
|
||||
access_table[card_id] = card_name
|
||||
minetest.chat_send_player(playername, "Granted access to card-id '" .. card_id .. "'")
|
||||
minetest.sound_play("scifi_nodes_scanner_granted", { pos = pos, max_hear_distance = 10 })
|
||||
end
|
||||
|
||||
local msg = ""
|
||||
if next(access_table) then
|
||||
msg = msg .. "Current registered cards: "
|
||||
for id, name in pairs(access_table) do
|
||||
msg = msg .. "Name: '" .. name .. "' ID: '" .. id .. "' / "
|
||||
end
|
||||
else
|
||||
-- access table is empty
|
||||
msg = "No access-card left in access-table, door is free to use"
|
||||
end
|
||||
minetest.chat_send_player(playername, msg)
|
||||
|
||||
-- set new access table
|
||||
set_door_access_table(node_meta, access_table)
|
||||
end
|
||||
|
||||
local function configure_access_card(meta, name)
|
||||
local id = meta:get_string("id")
|
||||
if id == "" then
|
||||
-- set new id
|
||||
id = create_id()
|
||||
meta:set_string("id", id)
|
||||
end
|
||||
|
||||
meta:set_string("name", name)
|
||||
meta:set_string("description", "Access card '" .. name .. "' (id: '" .. id .. "')")
|
||||
end
|
||||
|
||||
-- right-click with a card for rename/configuration
|
||||
local function on_secondary_use(itemstack, player, pointed_thing)
|
||||
local meta = itemstack:get_meta()
|
||||
if meta:get_string("id") == "" then
|
||||
-- initial configuration
|
||||
configure_access_card(meta, "")
|
||||
end
|
||||
local name = meta:get_string("name")
|
||||
|
||||
minetest.show_formspec(player:get_player_name(), FORMSPEC_NAME, [[
|
||||
size[10,1.4]
|
||||
real_coordinates[true]
|
||||
field[0.1,0.4;7,0.8;name;Name;]] .. minetest.formspec_escape(name) .. [[]
|
||||
button_exit[7.3,0.4;2.5,0.8;save;Save]
|
||||
]])
|
||||
|
||||
return itemstack
|
||||
end
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if formname ~= FORMSPEC_NAME then
|
||||
-- wrong formspec
|
||||
return false
|
||||
end
|
||||
|
||||
if not fields.save and not fields.key_enter_field then
|
||||
-- quit
|
||||
return true
|
||||
end
|
||||
|
||||
local itemstack = player:get_wielded_item()
|
||||
if itemstack:get_name() ~= "scifi_nodes:access_card" then
|
||||
-- invalid item
|
||||
return true
|
||||
end
|
||||
|
||||
local meta = itemstack:get_meta()
|
||||
configure_access_card(meta, fields.name or "")
|
||||
player:set_wielded_item(itemstack)
|
||||
end)
|
||||
|
||||
minetest.register_craftitem("scifi_nodes:access_card", {
|
||||
description = "Access card (unconfigured)",
|
||||
inventory_image = "scifi_nodes_access_card.png",
|
||||
palette = "unifieddyes_palette_extended.png",
|
||||
stack_max = 1,
|
||||
paramtype2 = "color",
|
||||
on_use = on_use,
|
||||
on_secondary_use = on_secondary_use,
|
||||
groups = {
|
||||
ud_param2_colorable = 1
|
||||
}
|
||||
})
|
||||
|
||||
-- initial recipe
|
||||
minetest.register_craft({
|
||||
output = "scifi_nodes:access_card",
|
||||
recipe = {
|
||||
{"scifi_nodes:white2", "", ""},
|
||||
{"scifi_nodes:white_pad", "", ""},
|
||||
{"scifi_nodes:white2", "", ""}
|
||||
}
|
||||
})
|
||||
|
||||
-- copy recipe
|
||||
minetest.register_craft({
|
||||
output = "scifi_nodes:access_card",
|
||||
recipe = {
|
||||
{"scifi_nodes:access_card", "scifi_nodes:white_pad", ""},
|
||||
{"", "", ""},
|
||||
{"", "", ""}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
|
||||
if itemstack:get_name() ~= "scifi_nodes:access_card" then
|
||||
return
|
||||
end
|
||||
|
||||
local original
|
||||
local index
|
||||
for i = 1, #old_craft_grid do
|
||||
if old_craft_grid[i]:get_name() == "scifi_nodes:access_card" then
|
||||
original = old_craft_grid[i]
|
||||
index = i
|
||||
break
|
||||
end
|
||||
end
|
||||
if not original then
|
||||
return
|
||||
end
|
||||
|
||||
-- copy metadata
|
||||
local src_meta = original:get_meta()
|
||||
local dst_meta = itemstack:get_meta()
|
||||
local copy_fields = {"id", "name", "description"}
|
||||
for _, fieldname in ipairs(copy_fields) do
|
||||
dst_meta:set_string(fieldname, src_meta:get_string(fieldname))
|
||||
end
|
||||
|
||||
if old_craft_grid[2]:get_name() == "scifi_nodes:white_pad" then
|
||||
-- keep original item if the copy-recipe is used
|
||||
craft_inv:set_stack("craft", index, original)
|
||||
end
|
||||
end)
|
||||
|
||||
if minetest.get_modpath("unifieddyes") then
|
||||
-- add colored crafts
|
||||
unifieddyes.register_color_craft({
|
||||
output = "scifi_nodes:access_card",
|
||||
palette = "extended",
|
||||
neutral_node = "scifi_nodes:access_card",
|
||||
recipe = {
|
||||
"NEUTRAL_NODE",
|
||||
"MAIN_DYE"
|
||||
},
|
||||
type = "shapeless"
|
||||
})
|
||||
|
||||
end
|
73
ambience.lua
Normal file
73
ambience.lua
Normal file
@ -0,0 +1,73 @@
|
||||
|
||||
-- currently playing sounds per mapblock
|
||||
-- mapblock_pos[number]
|
||||
local currently_playing = {}
|
||||
|
||||
-- clear the currently playing tracker every few seconds
|
||||
local function clear_currently_playing()
|
||||
currently_playing = {}
|
||||
minetest.after(5, clear_currently_playing)
|
||||
end
|
||||
minetest.after(5, clear_currently_playing)
|
||||
|
||||
-- mapblock resolution
|
||||
local function get_key(pos)
|
||||
return minetest.pos_to_string(vector.round(vector.divide(pos, 16)))
|
||||
end
|
||||
|
||||
local function add_currently_playing(pos, value)
|
||||
local key = get_key(pos)
|
||||
local count = currently_playing[key]
|
||||
if not count then
|
||||
-- new entry
|
||||
count = value
|
||||
else
|
||||
-- update entry
|
||||
count = count + value
|
||||
end
|
||||
currently_playing[key] = count
|
||||
end
|
||||
|
||||
-- limit plaing sounds per mapblock
|
||||
local function can_play(pos)
|
||||
local count = currently_playing[get_key(pos)]
|
||||
return not count or count < 25
|
||||
end
|
||||
|
||||
-- register ambience sounds with node-timer
|
||||
function scifi_nodes.register_ambience(nodename, soundname, opts)
|
||||
assert(opts)
|
||||
opts.interval = opts.interval or 60
|
||||
|
||||
local function play(pos)
|
||||
minetest.sound_play(soundname ,{
|
||||
max_hear_distance = opts.max_hear_distance or 16,
|
||||
pos = pos,
|
||||
gain = opts.gain or 0.7
|
||||
})
|
||||
end
|
||||
|
||||
minetest.override_item(nodename, {
|
||||
on_timer = function(pos)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
|
||||
if not can_play(pos) then
|
||||
-- too many sounds playing, recheck again soon
|
||||
timer:start(1)
|
||||
return
|
||||
end
|
||||
|
||||
-- increment usage count
|
||||
add_currently_playing(pos, 1)
|
||||
play(pos)
|
||||
|
||||
-- restart timer
|
||||
timer:start(opts.interval)
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
play(pos)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(opts.interval)
|
||||
end
|
||||
})
|
||||
end
|
11
chest.lua
11
chest.lua
@ -1,20 +1,21 @@
|
||||
local has_default = minetest.get_modpath("default")
|
||||
|
||||
--chest code from default(Copyright (C) 2012 celeron55, Perttu Ahola <celeron55@gmail.com>)
|
||||
local chest_formspec =
|
||||
"size[8,9]" ..
|
||||
default.gui_bg ..
|
||||
default.gui_bg_img ..
|
||||
default.gui_slots ..
|
||||
(has_default and default.gui_bg or "") ..
|
||||
(has_default and default.gui_bg_img or "") ..
|
||||
(has_default and default.gui_slots or "") ..
|
||||
"list[current_name;main;0,0.3;8,4;]" ..
|
||||
"list[current_player;main;0,4.85;8,1;]" ..
|
||||
"list[current_player;main;0,6.08;8,3;8]" ..
|
||||
"listring[current_name;main]" ..
|
||||
"listring[current_player;main]" ..
|
||||
default.get_hotbar_bg(0,4.85)
|
||||
(has_default and default.get_hotbar_bg(0,4.85) or "")
|
||||
|
||||
-- Helper functions
|
||||
local function drop_chest_stuff()
|
||||
return function(pos, oldnode, oldmetadata, digger)
|
||||
return function(pos, _, oldmetadata)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
|
26
common.lua
26
common.lua
@ -1,7 +1,5 @@
|
||||
|
||||
|
||||
scifi_nodes.get_switch_rules = function(param2)
|
||||
|
||||
function scifi_nodes.get_switch_rules(param2)
|
||||
-- param2 = 2
|
||||
local rules = {
|
||||
{x=1, y=-1, z=-1},
|
||||
@ -10,7 +8,7 @@ scifi_nodes.get_switch_rules = function(param2)
|
||||
{x=0, y=-1, z=1},
|
||||
}
|
||||
|
||||
-- Left and right when looking to +y ?
|
||||
-- Left and right when looking to +y ?
|
||||
if param2 == 3 then
|
||||
rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right (rules))
|
||||
elseif param2 == 4 then
|
||||
@ -20,3 +18,23 @@ scifi_nodes.get_switch_rules = function(param2)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
scifi_nodes.slope_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
|
||||
{-0.5, -0.25, -0.25, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.25, 0.5},
|
||||
{-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}
|
||||
}
|
||||
}
|
||||
|
||||
scifi_nodes.slope_box_simple = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.25, -0.25},
|
||||
{-0.5, -0.25, -0.25, 0.5, 0, 0},
|
||||
{-0.5, 0, 0, 0.5, 0.25, 0.25},
|
||||
{-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ local digicode_context = {}
|
||||
|
||||
-- after_place_node, use by digicode and palm_scanner
|
||||
-- placer is a player object
|
||||
local function set_owner(pos, placer, itemstack, pointed_thing)
|
||||
local function set_owner(pos, placer)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("owner", placer:get_player_name())
|
||||
meta:set_string("code", secret_code)
|
||||
@ -48,7 +48,7 @@ local function update_code(pos, code)
|
||||
meta:set_string("code", code)
|
||||
end
|
||||
|
||||
local function show_digicode_formspec(pos, node, player, itemstack, pointed_thing)
|
||||
local function show_digicode_formspec(pos, _, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local owner = meta:get_string("owner")
|
||||
local current_code = meta:get_string("code")
|
||||
|
28
doors.lua
28
doors.lua
@ -120,7 +120,7 @@ for _, current_door in ipairs(doors) do
|
||||
return itemstack;
|
||||
end
|
||||
|
||||
local function afterdestruct(pos, oldnode)
|
||||
local function afterdestruct(pos)
|
||||
minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"})
|
||||
end
|
||||
|
||||
@ -148,14 +148,18 @@ for _, current_door in ipairs(doors) do
|
||||
|
||||
local adjacent = minetest.get_node({x=x, y=y, z=z})
|
||||
if adjacent.name == target_opposite then
|
||||
minetest.set_node({x=x, y=y, z=z}, {name=target, param2 = adjacent.param2})
|
||||
minetest.set_node({x=x, y=y+1, z=z}, {name=target_top, param2 = adjacent.param2})
|
||||
minetest.swap_node({x=x, y=y, z=z}, {name=target, param2 = adjacent.param2})
|
||||
minetest.swap_node({x=x, y=y+1, z=z}, {name=target_top, param2 = adjacent.param2})
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local function open_door(pos, node)
|
||||
local function open_door(pos, node, player, itemstack)
|
||||
if not scifi_nodes.door_check_access_card(pos, itemstack, player) then
|
||||
return
|
||||
end
|
||||
|
||||
-- play sound
|
||||
minetest.sound_play(sound,{
|
||||
max_hear_distance = 16,
|
||||
@ -165,20 +169,20 @@ for _, current_door in ipairs(doors) do
|
||||
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
|
||||
minetest.set_node(pos, {name=opened, param2=node.param2})
|
||||
minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, {name=opened_top, param2=node.param2})
|
||||
minetest.swap_node(pos, {name=opened, param2=node.param2})
|
||||
minetest.swap_node({x=pos.x,y=pos.y+1,z=pos.z}, {name=opened_top, param2=node.param2})
|
||||
|
||||
change_adjacent(opened, pos, node)
|
||||
|
||||
timer:start(3)
|
||||
end
|
||||
|
||||
local function afterplace(pos, placer, itemstack, pointed_thing)
|
||||
local function afterplace(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name=opened_top,param2=node.param2})
|
||||
end
|
||||
|
||||
local function ontimer(pos, elapsed)
|
||||
local function ontimer(pos)
|
||||
-- play sound
|
||||
minetest.sound_play(sound,{
|
||||
max_hear_distance = 16,
|
||||
@ -188,8 +192,8 @@ for _, current_door in ipairs(doors) do
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
|
||||
minetest.set_node(pos, {name=closed, param2=node.param2})
|
||||
minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, {name=closed_top, param2=node.param2})
|
||||
minetest.swap_node(pos, {name=closed, param2=node.param2})
|
||||
minetest.swap_node({x=pos.x,y=pos.y+1,z=pos.z}, {name=closed_top, param2=node.param2})
|
||||
|
||||
change_adjacent(closed, pos, node)
|
||||
end
|
||||
@ -218,7 +222,7 @@ for _, current_door in ipairs(doors) do
|
||||
},
|
||||
}
|
||||
|
||||
local function nodig(pos, digger)
|
||||
local function nodig()
|
||||
return false
|
||||
end
|
||||
|
||||
@ -242,7 +246,7 @@ for _, current_door in ipairs(doors) do
|
||||
paramtype2 = "facedir",
|
||||
groups = {
|
||||
cracky = 3,
|
||||
oddly_breakable_by_hand = 1,
|
||||
dig_generic = 3,
|
||||
scifi_nodes_door = 1,
|
||||
door = 1
|
||||
},
|
||||
|
7
init.lua
7
init.lua
@ -14,15 +14,17 @@ end
|
||||
dofile(MP.."/common.lua")
|
||||
|
||||
if minetest.get_modpath("default") then
|
||||
-- only load builder and chest if the default mod is available
|
||||
-- only load builder if the default mod is available
|
||||
-- the formspecs depend on it
|
||||
dofile(MP.."/builder.lua")
|
||||
dofile(MP.."/chest.lua")
|
||||
end
|
||||
|
||||
dofile(MP.."/ambience.lua")
|
||||
dofile(MP.."/chest.lua")
|
||||
dofile(MP.."/plants.lua")
|
||||
dofile(MP.."/models.lua")
|
||||
dofile(MP.."/nodes.lua")
|
||||
dofile(MP.."/access_card.lua")
|
||||
dofile(MP.."/doors.lua")
|
||||
dofile(MP.."/switch.lua")
|
||||
dofile(MP.."/protected_switch.lua")
|
||||
@ -30,6 +32,7 @@ dofile(MP.."/nodeboxes.lua")
|
||||
dofile(MP.."/palm_scanner.lua")
|
||||
dofile(MP.."/digicode.lua")
|
||||
dofile(MP.."/octagon_panes.lua")
|
||||
dofile(MP.."/octagon_glass.lua")
|
||||
dofile(MP.."/forcefield.lua")
|
||||
dofile(MP.."/crafts.lua")
|
||||
|
||||
|
4
mod.conf
4
mod.conf
@ -1,6 +1,7 @@
|
||||
name = scifi_nodes
|
||||
description = Minetest mod that adds scifi themed blocks, doors, materials, plants and other assets.
|
||||
optional_depends = """
|
||||
advtrains,
|
||||
default,
|
||||
xpanes,
|
||||
mesecons,
|
||||
@ -15,5 +16,6 @@ unifieddyes,
|
||||
letters,
|
||||
mesecons_stealthnode,
|
||||
mtt,
|
||||
slats
|
||||
slats,
|
||||
signs_api
|
||||
"""
|
||||
|
24
models.lua
24
models.lua
@ -16,24 +16,8 @@ function scifi_nodes.register_slope(name, desc, texture, light, soundtype)
|
||||
drawtype = "mesh",
|
||||
mesh = "scifi_nodes_slope.obj",
|
||||
tiles = texture,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
|
||||
{-0.5, -0.25, -0.25, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.25, 0.5},
|
||||
{-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}
|
||||
}
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
|
||||
{-0.5, -0.25, -0.25, 0.5, 0, 0.5},
|
||||
{-0.5, 0, 0, 0.5, 0.25, 0.5},
|
||||
{-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}
|
||||
}
|
||||
},
|
||||
selection_box = scifi_nodes.slope_box,
|
||||
collision_box = scifi_nodes.slope_box,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "clip",
|
||||
@ -47,8 +31,8 @@ end
|
||||
|
||||
-- register some blocks in stairsplus if available (part of moreblocks)
|
||||
scifi_nodes.register_slope("white2", "Plastic", {"scifi_nodes_white2.png",}, 0, "stone")
|
||||
scifi_nodes.register_slope("super_white", "Super Plastic", {"scifi_nodes_super_white.png",}, 11, "stone")
|
||||
scifi_nodes.register_slope("ultra_white", "Super Plastic", {"scifi_nodes_ultra_white.png",}, minetest.LIGHT_MAX, "stone")
|
||||
scifi_nodes.register_slope("super_white", "Super Plastic", {"scifi_nodes_white2.png",}, 11, "stone")
|
||||
scifi_nodes.register_slope("ultra_white", "Super Plastic", {"scifi_nodes_white2.png",},minetest.LIGHT_MAX, "stone")
|
||||
scifi_nodes.register_slope("black", "Black", {"scifi_nodes_black.png",}, 0)
|
||||
scifi_nodes.register_slope("white", "White", {"scifi_nodes_white.png",}, 0)
|
||||
scifi_nodes.register_slope("grey", "Grey", {"scifi_nodes_grey.png",}, 0)
|
||||
|
12
models/scifi_nodes_slope_simple.obj
Normal file
12
models/scifi_nodes_slope_simple.obj
Normal file
@ -0,0 +1,12 @@
|
||||
g top
|
||||
v 0.500000 0.500000 0.500000
|
||||
v -0.500000 0.500000 0.500000
|
||||
v -0.500000 -0.500000 -0.500000
|
||||
v 0.500000 -0.500000 -0.500000
|
||||
vt 1.0000 1.0000
|
||||
vt 0.0000 1.0000
|
||||
vt 0.0000 0.0000
|
||||
vt 1.0000 0.0000
|
||||
vn 0.0000 0.7071 -0.7071
|
||||
s off
|
||||
f 2/1/1 1/2/1 4/3/1 3/4/1
|
61
nodes.json
61
nodes.json
@ -8,20 +8,29 @@
|
||||
"white2": {
|
||||
"description": "plastic",
|
||||
"colorable": true,
|
||||
"sounds": "stone"
|
||||
"sounds": "stone",
|
||||
"signs_banner": true,
|
||||
"signs_banner_color": "#000"
|
||||
},
|
||||
"super_white": {
|
||||
"description": "Super Plastic",
|
||||
"light": 11,
|
||||
"sounds": "stone"
|
||||
"sounds": "stone",
|
||||
"texture_name": "white2"
|
||||
},
|
||||
"ultra_white": {
|
||||
"description": "Ultra Plastic",
|
||||
"light": 14,
|
||||
"sounds": "stone"
|
||||
"sounds": "stone",
|
||||
"texture_name": "white2"
|
||||
},
|
||||
"engine": {
|
||||
"description": "Engine"
|
||||
"description": "Engine",
|
||||
"ambience": {
|
||||
"scifi_nodes_ambience_engine": {
|
||||
"interval": 16.1
|
||||
}
|
||||
}
|
||||
},
|
||||
"wall": {
|
||||
"description": "metal wall"
|
||||
@ -54,11 +63,17 @@
|
||||
"description": "transparent vent",
|
||||
"texture_name": "vent2",
|
||||
"texture_modifier": "^[makealpha:33,33,33",
|
||||
"drawtype": "glasslike"
|
||||
"drawtype": "glasslike",
|
||||
"ambience": {
|
||||
"scifi_nodes_ambience_vent": {
|
||||
"interval": 4.2
|
||||
}
|
||||
}
|
||||
},
|
||||
"stripes": {
|
||||
"description": "hazard stripes",
|
||||
"slat": true
|
||||
"slat": true,
|
||||
"advtrains_platform": true
|
||||
},
|
||||
"rust": {
|
||||
"description": "rusty metal"
|
||||
@ -67,7 +82,8 @@
|
||||
"description": "metal mesh"
|
||||
},
|
||||
"black": {
|
||||
"description": "black wall"
|
||||
"description": "black wall",
|
||||
"signs_banner": true
|
||||
},
|
||||
"blackoct": {
|
||||
"description": "black octagon"
|
||||
@ -79,7 +95,8 @@
|
||||
"description": "black tile"
|
||||
},
|
||||
"blacktile2": {
|
||||
"description": "black tile 2"
|
||||
"description": "black tile 2",
|
||||
"paramtype2": "none"
|
||||
},
|
||||
"blackvent": {
|
||||
"description": "black vent"
|
||||
@ -88,7 +105,8 @@
|
||||
"description": "blue bars"
|
||||
},
|
||||
"bluemetal": {
|
||||
"description": "blue metal"
|
||||
"description": "blue metal",
|
||||
"signs_banner": true
|
||||
},
|
||||
"bluetile": {
|
||||
"description": "blue tile",
|
||||
@ -134,7 +152,8 @@
|
||||
"description": "red metal block"
|
||||
},
|
||||
"grey_square": {
|
||||
"description": "grey metal block"
|
||||
"description": "grey metal block",
|
||||
"paramtype2": "none"
|
||||
},
|
||||
"blue_square": {
|
||||
"description": "blue metal block"
|
||||
@ -147,7 +166,8 @@
|
||||
"colorable": true
|
||||
},
|
||||
"greenmetal": {
|
||||
"description": "green metal wall"
|
||||
"description": "green metal wall",
|
||||
"signs_banner": true
|
||||
},
|
||||
"greenmetal2": {
|
||||
"description": "green metal wall2"
|
||||
@ -171,7 +191,8 @@
|
||||
"description": "green pipes"
|
||||
},
|
||||
"grey": {
|
||||
"description": "grey wall"
|
||||
"description": "grey wall",
|
||||
"signs_banner": true
|
||||
},
|
||||
"greybolts": {
|
||||
"description": "grey wall bolts"
|
||||
@ -225,7 +246,8 @@
|
||||
},
|
||||
"blackdmg": {
|
||||
"description": "Damaged black wall",
|
||||
"slat": true
|
||||
"slat": true,
|
||||
"paramtype2": "none"
|
||||
},
|
||||
"blackdmgstripe": {
|
||||
"description": "Damaged black wall(stripes)"
|
||||
@ -252,7 +274,12 @@
|
||||
"light": 5
|
||||
},
|
||||
"fan": {
|
||||
"description": "Fan"
|
||||
"description": "Fan",
|
||||
"ambience": {
|
||||
"scifi_nodes_ambience_fan": {
|
||||
"interval": 7
|
||||
}
|
||||
}
|
||||
},
|
||||
"ppllght": {
|
||||
"description": "Purple wall light",
|
||||
@ -275,7 +302,8 @@
|
||||
"slat": true
|
||||
},
|
||||
"purple": {
|
||||
"description": "Purple node"
|
||||
"description": "Purple node",
|
||||
"signs_banner": true
|
||||
},
|
||||
"rock": {
|
||||
"description": "Moonstone",
|
||||
@ -291,6 +319,7 @@
|
||||
"description": "Black vent"
|
||||
},
|
||||
"blackplate": {
|
||||
"description": "Black plate"
|
||||
"description": "Black plate",
|
||||
"paramtype2": "none"
|
||||
}
|
||||
}
|
124
nodes.lua
124
nodes.lua
@ -1,6 +1,8 @@
|
||||
local has_unifieddyes_mod = minetest.get_modpath("unifieddyes")
|
||||
local has_moreblocks_mod = minetest.get_modpath("moreblocks")
|
||||
local has_slats_mod = minetest.get_modpath("slats")
|
||||
local has_advtrains_mod = minetest.get_modpath("advtrains")
|
||||
local has_signs_api_mod = minetest.get_modpath("signs_api")
|
||||
|
||||
--nodes
|
||||
|
||||
@ -367,95 +369,6 @@ minetest.register_node("scifi_nodes:grnpipe2", {
|
||||
on_place = minetest.rotate_node
|
||||
})
|
||||
|
||||
minetest.register_node("scifi_nodes:octrng", {
|
||||
description = "Orange Octagon Glass",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "glasslike",
|
||||
tiles = {
|
||||
"scifi_nodes_octrng.png",
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "blend",
|
||||
light_source = 10,
|
||||
groups = {cracky=2, dig_generic = 3},
|
||||
is_ground_content = false,
|
||||
sounds = scifi_nodes.node_sound_glass_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("scifi_nodes:octgrn", {
|
||||
description = "Green Octagon Glass",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "glasslike",
|
||||
tiles = {
|
||||
"scifi_nodes_octgrn.png",
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "blend",
|
||||
light_source = 10,
|
||||
groups = {cracky=2, dig_generic = 3},
|
||||
is_ground_content = false,
|
||||
sounds = scifi_nodes.node_sound_glass_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("scifi_nodes:octbl", {
|
||||
description = "Blue Octagon Glass",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "glasslike",
|
||||
tiles = {
|
||||
"scifi_nodes_octbl.png",
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "blend",
|
||||
light_source = 10,
|
||||
groups = {cracky=2, dig_generic = 3},
|
||||
is_ground_content = false,
|
||||
sounds = scifi_nodes.node_sound_glass_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("scifi_nodes:octppl", {
|
||||
description = "Purple Octagon Glass",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "glasslike",
|
||||
tiles = {
|
||||
"scifi_nodes_octppl.png",
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "blend",
|
||||
light_source = 10,
|
||||
groups = {cracky=2, dig_generic = 3},
|
||||
is_ground_content = false,
|
||||
sounds = scifi_nodes.node_sound_glass_defaults(),
|
||||
})
|
||||
|
||||
if has_unifieddyes_mod then
|
||||
minetest.register_node("scifi_nodes:octwht", {
|
||||
description = "Octagon Glass",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "glasslike",
|
||||
tiles = {
|
||||
"scifi_nodes_octwht.png",
|
||||
},
|
||||
palette = "unifieddyes_palette_extended.png",
|
||||
paramtype = "light",
|
||||
paramtype2 = "color",
|
||||
use_texture_alpha = "blend",
|
||||
light_source = 10,
|
||||
groups = {
|
||||
cracky = 2,
|
||||
dig_generic = 3,
|
||||
ud_param2_colorable = 1
|
||||
},
|
||||
is_ground_content = false,
|
||||
sounds = scifi_nodes.node_sound_glass_defaults(),
|
||||
on_construct = unifieddyes.on_construct,
|
||||
on_dig = unifieddyes.on_dig
|
||||
})
|
||||
end
|
||||
|
||||
minetest.register_node("scifi_nodes:tower", {
|
||||
description = "Wind tower",
|
||||
sunlight_propagates = false,
|
||||
@ -624,7 +537,8 @@ for name, def in pairs(nodes) do
|
||||
end
|
||||
|
||||
-- register node
|
||||
minetest.register_node("scifi_nodes:"..name, node_def)
|
||||
local nodename = "scifi_nodes:" .. name
|
||||
minetest.register_node(nodename , node_def)
|
||||
|
||||
-- unified dyes registration
|
||||
if def.colorable and has_unifieddyes_mod then
|
||||
@ -661,6 +575,36 @@ for name, def in pairs(nodes) do
|
||||
})
|
||||
end
|
||||
|
||||
if def.ambience then
|
||||
for soundname, opts in pairs(def.ambience) do
|
||||
scifi_nodes.register_ambience(nodename, soundname, opts)
|
||||
end
|
||||
end
|
||||
|
||||
-- advtrains platform registration
|
||||
if has_advtrains_mod and def.advtrains_platform then
|
||||
advtrains.register_platform("scifi_nodes", "scifi_nodes:" .. name)
|
||||
end
|
||||
|
||||
if has_signs_api_mod and def.signs_banner then
|
||||
signs_api.register_sign("scifi_nodes", name .. "_banner", {
|
||||
depth = 1/16,
|
||||
width = 5,
|
||||
height = 1,
|
||||
entity_fields = {
|
||||
maxlines = 1,
|
||||
color = def.signs_banner_color or "#fff",
|
||||
},
|
||||
node_fields = {
|
||||
visual_scale = 1,
|
||||
description = name .. " banner",
|
||||
tiles = tiles,
|
||||
inventory_image = "scifi_nodes_" .. name .. ".png",
|
||||
use_texture_alpha = "clip",
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if has_slats_mod and def.slat then
|
||||
slats.register_slat(
|
||||
name,
|
||||
|
53
octagon_glass.lua
Normal file
53
octagon_glass.lua
Normal file
@ -0,0 +1,53 @@
|
||||
local has_unifieddyes_mod = minetest.get_modpath("unifieddyes")
|
||||
|
||||
local function register_glass(key, name)
|
||||
local tiles = {"scifi_nodes_" .. key .. ".png"}
|
||||
|
||||
minetest.register_node("scifi_nodes:" .. key, {
|
||||
description = name .. " Octagon Glass",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "glasslike",
|
||||
tiles = tiles,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "blend",
|
||||
light_source = 10,
|
||||
groups = {
|
||||
cracky = 2,
|
||||
dig_generic = 3
|
||||
},
|
||||
is_ground_content = false,
|
||||
sounds = scifi_nodes.node_sound_glass_defaults(),
|
||||
})
|
||||
end
|
||||
|
||||
register_glass("octppl", "Purple")
|
||||
register_glass("octbl", "Blue")
|
||||
register_glass("octgrn", "Green")
|
||||
register_glass("octrng", "Orange")
|
||||
register_glass("octwht", "White")
|
||||
|
||||
if has_unifieddyes_mod then
|
||||
minetest.register_node("scifi_nodes:octwht", {
|
||||
description = "Octagon Glass",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "glasslike",
|
||||
tiles = {
|
||||
"scifi_nodes_octwht.png",
|
||||
},
|
||||
palette = "unifieddyes_palette_extended.png",
|
||||
paramtype = "light",
|
||||
paramtype2 = "color",
|
||||
use_texture_alpha = "blend",
|
||||
light_source = 10,
|
||||
groups = {
|
||||
cracky = 2,
|
||||
dig_generic = 3,
|
||||
ud_param2_colorable = 1
|
||||
},
|
||||
is_ground_content = false,
|
||||
sounds = scifi_nodes.node_sound_glass_defaults(),
|
||||
on_construct = unifieddyes.on_construct,
|
||||
on_dig = unifieddyes.on_dig
|
||||
})
|
||||
end
|
@ -1,13 +1,15 @@
|
||||
|
||||
local function register(basename, description, texture)
|
||||
local function register(basename, color, texture)
|
||||
local nodename_single = "scifi_nodes:" .. basename .. "_pane"
|
||||
local nodename_double = "scifi_nodes:" .. basename .. "_pane_double"
|
||||
local nodename_offset = "scifi_nodes:" .. basename .. "_pane_offset"
|
||||
local nodename_slope = "scifi_nodes:" .. basename .. "_slope"
|
||||
local recipe_ingredient = "scifi_nodes:" .. basename
|
||||
local base_decription = color .. " octagon glass"
|
||||
|
||||
-- single height
|
||||
minetest.register_node(nodename_single, {
|
||||
description = description,
|
||||
description = base_decription .. " pane",
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
texture
|
||||
@ -25,14 +27,17 @@ local function register(basename, description, texture)
|
||||
type = "fixed",
|
||||
fixed = {{-0.5, -0.5, -0.25, 0.5, 0.5, 0.25}},
|
||||
},
|
||||
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||
groups = {
|
||||
cracky = 3,
|
||||
oddly_breakable_by_hand = 3
|
||||
},
|
||||
use_texture_alpha = "blend",
|
||||
sounds = scifi_nodes.node_sound_glass_defaults()
|
||||
})
|
||||
|
||||
-- double height
|
||||
minetest.register_node(nodename_double, {
|
||||
description = description,
|
||||
description = base_decription .. " pane (double)",
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
texture
|
||||
@ -50,14 +55,17 @@ local function register(basename, description, texture)
|
||||
type = "fixed",
|
||||
fixed = {{-0.5, -0.5, -0.25, 0.5, 1.5, 0.25}},
|
||||
},
|
||||
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||
groups = {
|
||||
cracky = 3,
|
||||
oddly_breakable_by_hand = 3
|
||||
},
|
||||
use_texture_alpha = "blend",
|
||||
sounds = scifi_nodes.node_sound_glass_defaults()
|
||||
})
|
||||
|
||||
-- single height with offset
|
||||
minetest.register_node(nodename_offset, {
|
||||
description = description,
|
||||
description = base_decription .. " pane (offset)",
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
texture
|
||||
@ -75,11 +83,37 @@ local function register(basename, description, texture)
|
||||
type = "fixed",
|
||||
fixed = {{-0.5, -0.5, 0.75, 0.5, 0.5, 1.25}},
|
||||
},
|
||||
groups = {cracky = 3, oddly_breakable_by_hand = 3},
|
||||
groups = {
|
||||
cracky = 3,
|
||||
oddly_breakable_by_hand = 3,
|
||||
not_blocking_trains = 1
|
||||
},
|
||||
use_texture_alpha = "blend",
|
||||
sounds = scifi_nodes.node_sound_glass_defaults()
|
||||
})
|
||||
|
||||
-- slope pane
|
||||
minetest.register_node(nodename_slope, {
|
||||
description = base_decription .. " pane (slope)",
|
||||
sunlight_propagates = true,
|
||||
drawtype = "mesh",
|
||||
mesh = "scifi_nodes_slope_simple.obj",
|
||||
tiles = {
|
||||
texture
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "blend",
|
||||
light_source = 10,
|
||||
groups = {
|
||||
cracky = 2,
|
||||
dig_generic = 3
|
||||
},
|
||||
selection_box = scifi_nodes.slope_box_simple,
|
||||
collision_box = scifi_nodes.slope_box_simple,
|
||||
is_ground_content = false,
|
||||
sounds = scifi_nodes.node_sound_glass_defaults()
|
||||
})
|
||||
-- register recipes
|
||||
|
||||
minetest.register_craft({
|
||||
@ -89,6 +123,15 @@ local function register(basename, description, texture)
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = nodename_slope .. " 16",
|
||||
recipe = {
|
||||
{"", "", recipe_ingredient},
|
||||
{"", recipe_ingredient, ""},
|
||||
{recipe_ingredient, "", ""}
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = nodename_double .. " 16",
|
||||
recipe = {
|
||||
@ -104,8 +147,9 @@ local function register(basename, description, texture)
|
||||
})
|
||||
end
|
||||
|
||||
register("octrng", "Orange Octagon Glass pane", "scifi_nodes_octrng.png")
|
||||
register("octgrn", "Green Octagon Glass pane", "scifi_nodes_octgrn.png")
|
||||
register("octbl", "Blue Octagon Glass pane", "scifi_nodes_octbl.png")
|
||||
register("octppl", "Purple Octagon Glass pane", "scifi_nodes_octppl.png")
|
||||
register("octrng", "Orange", "scifi_nodes_octrng.png")
|
||||
register("octgrn", "Green", "scifi_nodes_octgrn.png")
|
||||
register("octbl", "Blue", "scifi_nodes_octbl.png")
|
||||
register("octppl", "Purple", "scifi_nodes_octppl.png")
|
||||
register("octwht", "White", "scifi_nodes_octwht.png")
|
||||
register("glass", "Dark Glass pane", "scifi_nodes_glass.png")
|
||||
|
BIN
sounds/scifi_nodes_ambience_engine.ogg
Normal file
BIN
sounds/scifi_nodes_ambience_engine.ogg
Normal file
Binary file not shown.
BIN
sounds/scifi_nodes_ambience_fan.ogg
Normal file
BIN
sounds/scifi_nodes_ambience_fan.ogg
Normal file
Binary file not shown.
BIN
sounds/scifi_nodes_ambience_vent.ogg
Normal file
BIN
sounds/scifi_nodes_ambience_vent.ogg
Normal file
Binary file not shown.
BIN
textures/scifi_nodes_access_card.png
Normal file
BIN
textures/scifi_nodes_access_card.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 83 B |
Binary file not shown.
Before Width: | Height: | Size: 83 B |
Loading…
x
Reference in New Issue
Block a user