diff --git a/.github/workflows/luacheck.yml b/.github/workflows/luacheck.yml index d00f53a..e930ebe 100644 --- a/.github/workflows/luacheck.yml +++ b/.github/workflows/luacheck.yml @@ -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 \ No newline at end of file diff --git a/.luacheckrc b/.luacheckrc index ab44472..5d14883 100644 --- a/.luacheckrc +++ b/.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" diff --git a/README.md b/README.md index e756270..b3fbb97 100644 --- a/README.md +++ b/README.md @@ -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: diff --git a/access_card.lua b/access_card.lua new file mode 100644 index 0000000..ee82676 --- /dev/null +++ b/access_card.lua @@ -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 \ No newline at end of file diff --git a/ambience.lua b/ambience.lua new file mode 100644 index 0000000..8528839 --- /dev/null +++ b/ambience.lua @@ -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 diff --git a/chest.lua b/chest.lua index 4ca91cd..48b0a1b 100644 --- a/chest.lua +++ b/chest.lua @@ -1,20 +1,21 @@ +local has_default = minetest.get_modpath("default") --chest code from default(Copyright (C) 2012 celeron55, Perttu Ahola ) 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() diff --git a/common.lua b/common.lua index 8bb7a3d..13dfe8e 100644 --- a/common.lua +++ b/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} + } +} diff --git a/digicode.lua b/digicode.lua index 1a5fdcf..6e8d622 100644 --- a/digicode.lua +++ b/digicode.lua @@ -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") diff --git a/doors.lua b/doors.lua index 35ba558..f9bdaf9 100644 --- a/doors.lua +++ b/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 }, diff --git a/init.lua b/init.lua index 4e3b33b..5ad3499 100644 --- a/init.lua +++ b/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") diff --git a/mod.conf b/mod.conf index 8a4629e..8d7ace2 100644 --- a/mod.conf +++ b/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 """ diff --git a/models.lua b/models.lua index dc54c82..e934a4b 100644 --- a/models.lua +++ b/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) diff --git a/models/scifi_nodes_slope_simple.obj b/models/scifi_nodes_slope_simple.obj new file mode 100644 index 0000000..d93373e --- /dev/null +++ b/models/scifi_nodes_slope_simple.obj @@ -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 \ No newline at end of file diff --git a/nodes.json b/nodes.json index 668d05a..5146d32 100644 --- a/nodes.json +++ b/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" } } \ No newline at end of file diff --git a/nodes.lua b/nodes.lua index 940bc16..6b5b791 100644 --- a/nodes.lua +++ b/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, diff --git a/octagon_glass.lua b/octagon_glass.lua new file mode 100644 index 0000000..9580029 --- /dev/null +++ b/octagon_glass.lua @@ -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 \ No newline at end of file diff --git a/octagon_panes.lua b/octagon_panes.lua index 5a6f18c..6a81ecc 100644 --- a/octagon_panes.lua +++ b/octagon_panes.lua @@ -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") diff --git a/sounds/scifi_nodes_ambience_engine.ogg b/sounds/scifi_nodes_ambience_engine.ogg new file mode 100644 index 0000000..ebf1acc Binary files /dev/null and b/sounds/scifi_nodes_ambience_engine.ogg differ diff --git a/sounds/scifi_nodes_ambience_fan.ogg b/sounds/scifi_nodes_ambience_fan.ogg new file mode 100644 index 0000000..c152927 Binary files /dev/null and b/sounds/scifi_nodes_ambience_fan.ogg differ diff --git a/sounds/scifi_nodes_ambience_vent.ogg b/sounds/scifi_nodes_ambience_vent.ogg new file mode 100644 index 0000000..941a4dd Binary files /dev/null and b/sounds/scifi_nodes_ambience_vent.ogg differ diff --git a/textures/scifi_nodes_access_card.png b/textures/scifi_nodes_access_card.png new file mode 100644 index 0000000..6810e52 Binary files /dev/null and b/textures/scifi_nodes_access_card.png differ diff --git a/textures/scifi_nodes_super_white.png b/textures/scifi_nodes_super_white.png deleted file mode 100644 index faf0ec1..0000000 Binary files a/textures/scifi_nodes_super_white.png and /dev/null differ diff --git a/textures/scifi_nodes_ultra_white.png b/textures/scifi_nodes_ultra_white.png deleted file mode 100644 index faf0ec1..0000000 Binary files a/textures/scifi_nodes_ultra_white.png and /dev/null differ