From deb7b7a05b1bd7bc834ed23da1f90fec8216fda4 Mon Sep 17 00:00:00 2001 From: wintersknight94 <62315647+wintersknight94@users.noreply.github.com> Date: Tue, 15 Feb 2022 20:06:15 -0600 Subject: [PATCH] Add files via upload --- README.md | 25 ++ eggburner.lua | 240 +++++++++++++ init.lua | 18 + lantern.lua | 438 ++++++++++++++++++++++++ luxlamp.lua | 148 ++++++++ mod.conf | 6 + rushlight.lua | 209 +++++++++++ smoke.lua | 52 +++ sounds/license.txt | 2 + sounds/wc_luminous_hissy.1.ogg | Bin 0 -> 19244 bytes sounds/wc_luminous_hissy.2.ogg | Bin 0 -> 28873 bytes textures/wc_luminous_fire.png | Bin 0 -> 450 bytes textures/wc_luminous_fire_anim.png | Bin 0 -> 1411 bytes textures/wc_luminous_fuel_1.png | Bin 0 -> 94 bytes textures/wc_luminous_fuel_10.png | Bin 0 -> 96 bytes textures/wc_luminous_fuel_2.png | Bin 0 -> 94 bytes textures/wc_luminous_fuel_3.png | Bin 0 -> 98 bytes textures/wc_luminous_fuel_4.png | Bin 0 -> 98 bytes textures/wc_luminous_fuel_5.png | Bin 0 -> 96 bytes textures/wc_luminous_fuel_6.png | Bin 0 -> 96 bytes textures/wc_luminous_fuel_7.png | Bin 0 -> 96 bytes textures/wc_luminous_fuel_8.png | Bin 0 -> 97 bytes textures/wc_luminous_fuel_9.png | Bin 0 -> 97 bytes textures/wc_luminous_fuel_slot.png | Bin 0 -> 106 bytes textures/wc_luminous_mask_globe.png | Bin 0 -> 113 bytes textures/wc_luminous_mask_lamp_side.png | Bin 0 -> 115 bytes textures/wc_luminous_mask_lamp_top.png | Bin 0 -> 119 bytes textures/wc_luminous_mask_lantern.png | Bin 0 -> 114 bytes textures/wc_luminous_mask_pit.png | Bin 0 -> 111 bytes 29 files changed, 1138 insertions(+) create mode 100644 README.md create mode 100644 eggburner.lua create mode 100644 init.lua create mode 100644 lantern.lua create mode 100644 luxlamp.lua create mode 100644 mod.conf create mode 100644 rushlight.lua create mode 100644 smoke.lua create mode 100644 sounds/license.txt create mode 100644 sounds/wc_luminous_hissy.1.ogg create mode 100644 sounds/wc_luminous_hissy.2.ogg create mode 100644 textures/wc_luminous_fire.png create mode 100644 textures/wc_luminous_fire_anim.png create mode 100644 textures/wc_luminous_fuel_1.png create mode 100644 textures/wc_luminous_fuel_10.png create mode 100644 textures/wc_luminous_fuel_2.png create mode 100644 textures/wc_luminous_fuel_3.png create mode 100644 textures/wc_luminous_fuel_4.png create mode 100644 textures/wc_luminous_fuel_5.png create mode 100644 textures/wc_luminous_fuel_6.png create mode 100644 textures/wc_luminous_fuel_7.png create mode 100644 textures/wc_luminous_fuel_8.png create mode 100644 textures/wc_luminous_fuel_9.png create mode 100644 textures/wc_luminous_fuel_slot.png create mode 100644 textures/wc_luminous_mask_globe.png create mode 100644 textures/wc_luminous_mask_lamp_side.png create mode 100644 textures/wc_luminous_mask_lamp_top.png create mode 100644 textures/wc_luminous_mask_lantern.png create mode 100644 textures/wc_luminous_mask_pit.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..7bb5ec1 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# WC_LUMINOUS +Adds new light sources to NodeCore +Far superior to the old "nc_light" in the following ways: + - Coal Lantern + - New Model With A More 'Nodecorian' Vibe + - No More Broken Textures (Hopefully) + - Can Be Emptied Without Being Broken Apart + - Fuel Maximum Has Been Buffed + - Recipe Cost Has Been Buffed + - Occasionally Drops Ashes While Lit + - Luxlamp + - New Recipe + - New Model + - Rebalanced Functionality + - Properly Charges (Hopefully) + - Rushlight + - Cheap Light Source + - Doesn't Require Charcoal + - Lasts Approximately 25% As Long As A Torch + - Egg Burner + - Incense Bowls! + - Uses Eggcorns For Fuel + - Dim Light, Long Duration + - Goes Out Faster When Carried +# ~LET THERE BE LIGHT~ diff --git a/eggburner.lua b/eggburner.lua new file mode 100644 index 0000000..15efec8 --- /dev/null +++ b/eggburner.lua @@ -0,0 +1,240 @@ +-- LUALOCALS < --------------------------------------------------------- +local ItemStack, math, minetest, nodecore, pairs, setmetatable, vector + = ItemStack, math, minetest, nodecore, pairs, setmetatable, vector +-- LUALOCALS > --------------------------------------------------------- +local modname = minetest.get_current_modname() +------------------------------------------------------------------------------- +local base = "nc_terrain_stone.png" +local boxy = "nc_concrete_pattern_boxy.png^[opacity:50" +local horzy = "nc_concrete_pattern_horzy.png^[opacity:50" +local pit = "(nc_fire_coal_4.png^[mask:" ..modname.. "_mask_pit.png)^[opacity:75" +local egg = "[combine:24x24:4,4=nc_tree_eggcorn.png\\^[resize\\:8x8" +local ember = "(nc_fire_coal_4.png^nc_fire_ember_3.png^[opacity:150)^[mask:" ..modname.. "_mask_pit.png" +local ash = "nc_fire_ash.png^[mask:" ..modname.. "_mask_pit.png" +------------------------------------------------------------------------------- +local rfcall = function(pos, data) + local ref = minetest.get_player_by_name(data.pname) + local wield = ref:get_wielded_item() + wield:take_item(1) + ref:set_wielded_item(wield) +end +------------------------------------------------------------------------------- +----------------INCENSE----------------- +local function burner(id, light, tile) + minetest.register_node(modname .. ":incense_" ..id, { + description = "Egg Burner", + tiles = tile, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.25, 0.25, -0.4375, 0.25}, -- Bowl_1 + {-0.375, -0.4375, -0.375, 0.375, -0.375, 0.375}, -- Bowl_2 + {-0.4375, -0.375, -0.4375, 0.4375, -0.25, 0.4375}, -- Bowl_3 + {-0.5, -0.25, -0.5, 0.5, 0, 0.5}, -- Bowl_4 + {-0.4375, 0, -0.4375, 0.4375, 0.0625, 0.4375}, -- Bowl_5 + {-0.375, 0.0625, -0.375, 0.375, 0.125, 0.375}, -- Bowl_6 + } + }, + sunlight_propagates = true, + light_source = light, + groups = { + stack_as_node = 1, + snappy = 1, + incense = 1, + totable = 1 + }, + stack_max = 1, + sounds = nodecore.sounds("nc_terrain_stony") + }) +end +------------------------------------------------------------------------------- +burner("empty", 0, + { + "(" ..base.. ")^(" ..boxy.. ")^(" ..pit.. ")", + base, + "(" ..base.. ")^(" ..horzy.. ")" + } +) +burner("unlit", 0, + { + "(" ..base.. ")^(" ..boxy.. ")^(" ..pit.. ")^(" ..egg.. ")", + base, + "(" ..base.. ")^(" ..horzy.. ")" + } +) +burner("lit", 4, + { + "(" ..base.. ")^(" ..boxy.. ")^(" ..pit.. ")^(" ..ember.. ")", + base, + "(" ..base.. ")^(" ..horzy.. ")" + } +) +burner("ashy", 0, + { + "(" ..base.. ")^(" ..boxy.. ")^(" ..pit.. ")^(" ..ash.. ")", + base, + "(" ..base.. ")^(" ..horzy.. ")" + } +) +----------------IGNITION----------------- +minetest.register_abm({ + label = "ignite eggburner", + interval = 10, + chance = 2, + nodenames = {modname.. ":incense_unlit"}, + neighbors = {"group:igniter", "group:torch_lit", "group:candle_lit"}, +-- action_delay = true, + action = function(pos) + if not nodecore.quenched(pos) then + minetest.set_node(pos, {name = modname.. ":incense_lit"}) + end + end + }) +----------------QUENCHING----------------- +nodecore.register_abm({ + label = "Incense Quenching", + interval = 0.1, + chance = 1, + nodenames = {modname .. ":incense_lit"}, + action = function(pos) + if nodecore.quenched(pos) then + nodecore.sound_play("nc_fire_snuff", {gain = 1, pos = pos}) + return minetest.set_node(pos, {name = modname.. ":incense_ashy"}) + end + end + }) +nodecore.register_aism({ + label = "Held Incense Quenching", + interval = 0.1, + chance = 1, + itemnames = {modname .. ":incense_lit"}, + action = function(stack, data) + local pos = data.pos + local player = data.player + ext = true + if player then + if data.list ~= "main" or player:get_wield_index() + ~= data.slot then ext = false end + pos = vector.add(pos, vector.multiply(player:get_look_dir(), 0.5)) + end + + if ext and nodecore.quenched(pos, data.node and 1 or 0.3) then + nodecore.sound_play("nc_fire_snuff", {gain = 1, pos = pos}) + stack:set_name(modname .. ":incense_ashy") + return stack + end + end +}) +------------BURNING UP------------ +nodecore.register_abm({ + label = "Incense Use", + interval = 900, + chance = 1, + nodenames = {modname .. ":incense_lit"}, + action = function(pos) + return minetest.set_node(pos, {name = modname .. ":incense_ashy"}) + end + }) +nodecore.register_aism({ + label = "Held Incense Use", + interval = 90, + chance = 10, + itemnames = {modname .. ":incense_lit"}, + action = function(stack, data) + stack:set_name(modname .. ":incense_ashy") + return stack + end + }) +------------REFILL BURNER------------ +nodecore.register_craft({ + label = "refill eggburner", + action = "pummel", + wield = {name = "nc_tree:eggcorn"}, + after = rfcall, + nodes = { + {match = modname .. ":incense_empty", replace = modname .. ":incense_unlit"} + } + }) +------------ASH DUMPING------------ +nodecore.register_craft({ + label = "empty incense", + action = "pummel", + duration = 1, + nodes = { + { + match = modname.. ":incense_ashy", + replace = modname.. ":incense_empty" + } + }, + items = { + {name = "nc_fire:lump_ash", count = 1} + } + }) +------------EGG DUMPING------------ +nodecore.register_craft({ + label = "remove incense", + action = "pummel", + nodes = { + { + match = modname.. ":incense_unlit", + replace = modname.. ":incense_empty" + } + }, + items = { + {name = "nc_tree:eggcorn", count = 1} + } + }) +------------Break Burner----------- +nodecore.register_craft({ + label = "break incense apart", + action = "pummel", + duration = 2, + toolgroups = {thumpy = 3, cracky = 3, choppy = 3}, + nodes = { + { + match = {groups = {incense = true}}, + replace = "nc_terrain:gravel" + } + }, + items = { + {name = "nc_stonework:chip", count = 3, scatter = 2}, + {name = "nc_fire:lump_ash", count = 1, scatter = 2}, + }, + itemscatter = 2 + }) +------------CRAFT INCENSE------------ +nodecore.register_craft({ + label = "chisel eggburner", + action = "pummel", + duration = 2, + toolgroups = {thumpy = 3}, + normal = {y = 1}, + indexkeys = {"group:chisel"}, + nodes = { + { + match = { + lode_temper_cool = true, + groups = {chisel = true} + }, + dig = true + }, + { + y = -1, + match = "nc_concrete:terrain_stone_boxy", + replace = modname .. ":incense_empty" + } + } +}) +---------------------------------------- +------------Incense Ambiance------------ +nodecore.register_ambiance({ + label = "Incense Ambiance", + nodenames = {modname.. ":incense_lit"}, + interval = 1, + chance = 2, + sound_name = "nc_fire_flamy", + sound_gain = 0.1 + }) + diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..46f5854 --- /dev/null +++ b/init.lua @@ -0,0 +1,18 @@ +-- LUALOCALS < --------------------------------------------------------- +local include, nodecore + = include, nodecore +-- LUALOCALS > --------------------------------------------------------- + +include("lantern") +include("luxlamp") +include("rushlight") +include("eggburner") +include("smoke") +--include("luxfly") +--include("") + +----------Let There Be Light---------- +---A mod for NodeCore that adds new--- +---light sources while maintaining---- +---game balance-----By WintersKnight-- +-------------------------------------- diff --git a/lantern.lua b/lantern.lua new file mode 100644 index 0000000..6eb2b5b --- /dev/null +++ b/lantern.lua @@ -0,0 +1,438 @@ +-- LUALOCALS < --------------------------------------------------------- +local ItemStack, math, minetest, nodecore, pairs, setmetatable, vector + = ItemStack, math, minetest, nodecore, pairs, setmetatable, vector +-- LUALOCALS > --------------------------------------------------------- +local modname = minetest.get_current_modname() +local checkdirs = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 1, z = 0} +} +---------------------------------------- +nodecore.lantern_life_base = 120 +nodecore.max_lantern_fuel = 10 +------------------------------------------------------------------------------- +local globe = "nc_optics_glass_glare.png^[mask:" ..modname.. "_mask_globe.png" +local plate = "nc_lode_annealed.png^[mask:" ..modname.. "_mask_lantern.png" +local fslot = modname.. "_fuel_slot.png^[opacity:65" +local ftile = modname.. "_fire.png" +------------------------------------------------------------------------------- +local flame = { + name = modname.. "_fire_anim.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 4 + } +} +------------------------------------------------------------------------------- +----------EMPTY LANTERN---------- +minetest.register_node(modname .. ":lantern_empty", { + description = "Lantern", + tiles = { + "nc_lode_annealed.png", + "nc_lode_annealed.png", + "(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")", + "(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")", + "(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")", + "(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")", + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.3125, 0.5}, -- BasePlate + {-0.5, 0.25, -0.5, 0.5, 0.375, 0.5}, -- TopPlate + {-0.375, 0.375, -0.375, 0.375, 0.4375, 0.375}, -- TopRiser + {-0.25, 0.4375, -0.25, 0.25, 0.5, 0.25}, -- TopCap + {-0.4375, -0.3125, -0.4375, 0.4375, -0.25, 0.4375}, -- BasePlate + {-0.375, -0.25, -0.375, 0.375, 0.25, 0.375}, -- Globe + } + }, + sunlight_propagates = true, +-- light_source = light, + groups = { + stack_as_node = 1, + snappy = 1, + lantern = 1, + lantern_fuel = 0, + lantern_off =1, + totable = 1 + }, + stack_max = 1, + sounds = nodecore.sounds("nc_lode_annealed"), + }) +---------------------------------------- +------------Lantern Crafting------------ +nodecore.register_craft({ + label = "assemble lantern", + action = "stackapply", + indexkeys = {"nc_lode:form"}, + wield = {name = "nc_optics:glass"}, + consumewield = 1, + nodes = { + {match = "nc_lode:form", replace = "air"}, + {y = -1, match = "nc_lode:block_annealed", replace = modname .. ":lantern_empty"}, + } + }) +---------------------------------------- +-----------FUELED LANTERN OFF----------- +local lnodes = {} +---------------------------------------- +local function lantern (fuel) -- Kimapr: deleted these redundant arguments (fuel, burn, energy, light, refill) +---------------------------------------- +local burn = fuel-1 +local aburns = burn == 0 and "empty" or "lit_"..burn -- nodename suffix after burn +local aburn = burn == 0 and "empty" or burn +local light = fuel + 6 +---------------------------------------- +minetest.register_node(modname .. ":lantern_" .. fuel, { + description = "Lantern", + tiles = { + "nc_lode_annealed.png", + "nc_lode_annealed.png", + "(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")^(" ..modname.. "_fuel_" ..fuel.. ".png)", + "(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")^(" ..modname.. "_fuel_" ..fuel.. ".png)", + "(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")^(" ..modname.. "_fuel_" ..fuel.. ".png)", + "(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")^(" ..modname.. "_fuel_" ..fuel.. ".png)" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.3125, 0.5}, -- BasePlate + {-0.5, 0.25, -0.5, 0.5, 0.375, 0.5}, -- TopPlate + {-0.375, 0.375, -0.375, 0.375, 0.4375, 0.375}, -- TopRiser + {-0.25, 0.4375, -0.25, 0.25, 0.5, 0.25}, -- TopCap + {-0.4375, -0.3125, -0.4375, 0.4375, -0.25, 0.4375}, -- BasePlate + {-0.375, -0.25, -0.375, 0.375, 0.25, 0.375}, -- Globe + } + }, + sunlight_propagates = true, +-- light_source = light, + groups = { + falling = 1, + flammable = 1, + stack_as_node = 1, + snappy = 1, + lantern_off = 1, + lantern_fuel = fuel, + lantern = 1, + totable = 1 + }, + stack_max = 1, + sounds = nodecore.sounds("nc_lode_annealed"), + on_ignite = function(pos, node) + minetest.set_node(pos, {name = modname .. ":lantern_lit_" .. fuel}) + minetest.sound_play("nc_fire_ignite", {gain = 1, pos = pos}) + return true + end + }) +---------------------------------------- +-----------FUELED LANTERN LIT----------- +minetest.register_node(modname .. ":lantern_lit_" .. fuel, { + description = "Lantern", + tiles = { + "nc_lode_annealed.png", + "nc_lode_annealed.png", + "(" ..ftile.. ")^(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")^(" ..modname.. "_fuel_" ..fuel.. ".png)", + "(" ..ftile.. ")^(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")^(" ..modname.. "_fuel_" ..fuel.. ".png)", + "(" ..ftile.. ")^(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")^(" ..modname.. "_fuel_" ..fuel.. ".png)", + "(" ..ftile.. ")^(" ..globe.. ")^(" ..plate.. ")^(" ..fslot.. ")^(" ..modname.. "_fuel_" ..fuel.. ".png)", + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.3125, 0.5}, -- BasePlate + {-0.5, 0.25, -0.5, 0.5, 0.375, 0.5}, -- TopPlate + {-0.375, 0.375, -0.375, 0.375, 0.4375, 0.375}, -- TopRiser + {-0.25, 0.4375, -0.25, 0.25, 0.5, 0.25}, -- TopCap + {-0.4375, -0.3125, -0.4375, 0.4375, -0.25, 0.4375}, -- BasePlate + {-0.375, -0.25, -0.375, 0.375, 0.25, 0.375}, -- Globe + } + }, + sunlight_propagates = true, + light_source = light, + groups = { + falling = 1, + stack_as_node = 1, + snappy = 1, + lantern_lit = 1, + lantern_fuel = fuel, + lantern = 1, + totable = 1 + }, + stack_max = 1, + sounds = nodecore.sounds("nc_lode_annealed") + }) +--lnodes[light] = nodecore.dynamic_light_node(light) +--lnodes[light-2] = nodecore.dynamic_light_node(light-2) +---------------------------------------- +------------Fuel Consumption------------ +-----Placed----- +nodecore.register_abm({ + label = "Lantern Quenching", + interval = 0.1, + chance = 1, + nodenames = {modname .. ":lantern_lit_" .. fuel}, + action = function(pos) + if nodecore.quenched(pos) then + nodecore.sound_play("nc_fire_snuff", {gain = 1, pos = pos}) + return minetest.set_node(pos, {name = modname .. ":lantern_"..fuel}) + end + end + }) +nodecore.register_abm({ + label = "Lantern Fuel Use", + interval = 100, + chance = 1, + nodenames = {modname .. ":lantern_lit_" .. fuel}, + action = function(pos) + nodecore.sound_play(modname .. "_hissy", {gain = 0.4, pos = pos}) + return minetest.set_node(pos, {name = modname .. ":lantern_" .. aburns}) + end + }) +-- Kimapr: merged two ABMs into one +-----Carried----- +nodecore.register_aism({ + label = "Lantern Quenching", + interval = 0.1, + chance = 1, + itemnames = {modname .. ":lantern_lit_" .. fuel}, + action = function(stack, data) + local pos = data.pos + local player = data.player + ext = true + if player then + if data.list ~= "main" or player:get_wield_index() + ~= data.slot then ext = false end + pos = vector.add(pos, vector.multiply(player:get_look_dir(), 0.5)) + end + + if ext and nodecore.quenched(pos, data.node and 1 or 0.3) then + nodecore.sound_play("nc_fire_snuff", {gain = 1, pos = pos}) + stack:set_name(modname .. ":lantern_"..fuel) + return stack + end + end +}) +nodecore.register_aism({ + label = "Held Fuel Use", + interval = 100, + chance = 1, + itemnames = {modname .. ":lantern_lit_" .. fuel}, + action = function(stack, data) + minetest.sound_play(modname .. "_hissy", {gain = 0.4, pos = data.pos}) + stack:set_name(modname .. ":lantern_" .. aburns) + return stack + end + }) +---------------------------------------- +-------------Lantern Refill------------- +local rfcall = function(pos, data) + local ref = minetest.get_player_by_name(data.pname) + local wield = ref:get_wielded_item() + wield:take_item(1) + ref:set_wielded_item(wield) +end + +nodecore.register_craft({ + label = "refill lantern", + action = "pummel", + wield = {name = "nc_fire:lump_coal"}, + after = rfcall, + nodes = { + {match = modname .. ":lantern_"..aburn, replace = modname .. ":lantern_"..fuel} + } + }) + +if fuel > 1 then + +nodecore.register_craft({ + label = "refill lit lantern", + action = "pummel", + wield = {name = "nc_fire:lump_coal"}, + after = rfcall, + nodes = { + { + match = modname .. ":lantern_"..aburns, + replace = modname .. ":lantern_lit_"..fuel + } + } + }) +end + +---------------------------------------- +------------Lantern Emptying------------ +nodecore.register_craft({ + label = "empty lantern", + action = "pummel", + duration = 1, +-- toolgroups = {thumpy = 1}, + nodes = { + { + match = modname.. ":lantern_" ..fuel, + replace = modname.. ":lantern_empty" + } + }, + items = { + {name = "nc_fire:lump_coal", count = fuel, scatter = 2} +-- {name = "nc_fire:lump_ash", count = ashes, scatter = ashes} + }, + itemscatter = 2 + }) + +---------------------------------------- +------------Lantern Recycling----------- +nodecore.register_craft({ + label = "break lantern apart", + action = "pummel", + duration = 2, + toolgroups = {choppy = 4}, + nodes = { + { + match = {groups = {lantern = true}}, + replace = "nc_lode:form" + } + }, + items = { + {name = "nc_optics:glass_crude", count = 1, scatter = 1}, + {name = "nc_lode:toolhead_mallet_annealed", count = 2, scatter = 3}, + {name = "nc_lode:prill_annealed", count = 2, scatter = 4} +-- {name = "nc_fire:lump_coal", count = fuel, scatter = 6}, +-- {name = "nc_fire:lump_ash", count = ashes, scatter = ashes} + }, + itemscatter = 2 + }) + +---------------------------------------- +------------Lantern Ambiance------------ +nodecore.register_ambiance({ + label = "Flame Ambiance", + nodenames = {modname.. ":lantern_lit_" ..fuel}, + interval = 1, + chance = 2, + sound_name = "nc_fire_flamy", + sound_gain = 0.1 + }) + +end +---------------------------------------- +---------------Falling Ash-------------- +-----Placed----- +nodecore.register_abm({ + label = "Lantern Ashing", + interval = 20, + chance = 4, + nodenames = {"group:lantern_lit"}, + action = function(pos) + nodecore.item_eject(pos, "nc_fire:lump_ash", 1) + end +}) +-----Carried----- +nodecore.register_aism({ + label = "Held Lantern Ashing", + interval = 20, + chance = 4, + itemnames = {"group:lantern_lit"}, + action = function(stack, data) + nodecore.item_eject(data.pos,"nc_fire:lump_ash",1,1,{x = 1, y = 1, z = 1}) + end +}) +---------------------------------------- +--------------WHEN WIELDED-------------- +local litgroup = {} +minetest.after(0, function() + for k, v in pairs(minetest.registered_items) do + if v.groups.lantern_lit then + litgroup[k] = true + end + end + end) +local function islit(stack) + return stack and litgroup[stack:get_name()] +end + +local function snuffinv(player, inv, i, fuel) + minetest.sound_play("nc_fire_snuff", {object = player, gain = 0.5}) + inv:set_stack("main", i, modname .. ":lantern_"..fuel) +end + + +local ambtimers = {} +minetest.register_globalstep(function() + local now = nodecore.gametime + for _, player in pairs(minetest.get_connected_players()) do + local inv = player:get_inventory() + local ppos = player:get_pos() + + -- Snuff all lanterns if doused in water. + local hpos = vector.add(ppos, {x = 0, y = 1, z = 0}) + local head = minetest.get_node(hpos).name + local wielditem = player:get_wielded_item() + local wdef = minetest.registered_items[wielditem:get_name()] + if minetest.get_item_group(head, "water") > 0 then + for i = 1, inv:get_size("main") do + local stack = inv:get_stack("main", i) + if islit(stack) then snuffinv(player, inv, i, minetest.get_item_group(stack:get_name(),"lantern_fuel")) end + end + elseif islit(player:get_wielded_item()) then + local bright = lnodes[wdef.light_source] + -- Wield light + local name = player:get_player_name() +-- nodecore.dynamic_light_add(hpos, bright, 0.5) + + -- Wield ambiance + local t = ambtimers[name] or 0 + if t <= now then + ambtimers[name] = now + 1 + minetest.sound_play("nc_fire_flamy", + {object = player, gain = 0.1}) + end + else + -- Dimmer non-wielded carry light + for i = 1, inv:get_size("main") do + local stack = inv:get_stack("main", i) + if islit(stack) then + local def = minetest.registered_items[stack:get_name()] + local dim = lnodes[def.light_source - 2] +-- nodecore.dynamic_light_add(hpos, dim, 0.5) + end + end + end + end + end) + +-- Apply wield light to entities as well. +local function entlight(self, ...) + local stack = ItemStack(self.node and self.node.name or self.itemstring or "") + local def = minetest.registered_items[stack:get_name()] + if not islit(stack) then return ... end + local bright = lnodes[def.light_source] +-- nodecore.dynamic_light_add(self.object:get_pos(), bright, 0.5) + return ... +end +for _, name in pairs({"item", "falling_node"}) do + local def = minetest.registered_entities["__builtin:" .. name] + local ndef = { + on_step = function(self, ...) + return entlight(self, def.on_step(self, ...)) + end + } + setmetatable(ndef, def) + minetest.register_entity(":__builtin:" .. name, ndef) +end + +--Lantern-Fuel-Burn-Energy-Light-Refill-- +for n=1,nodecore.max_lantern_fuel do + lantern(n) +end + + diff --git a/luxlamp.lua b/luxlamp.lua new file mode 100644 index 0000000..316adec --- /dev/null +++ b/luxlamp.lua @@ -0,0 +1,148 @@ +-- LUALOCALS < --------------------------------------------------------- +local minetest, nodecore, math + = minetest, nodecore, math +-- LUALOCALS > --------------------------------------------------------- +local modname = minetest.get_current_modname() +------------------------------------------------------------------------ +local function luxlamp (desc, id, power, light) +local delum = power-1 +local flux = power+1 +local charge = power*100 +local vlux = power*60 +local time = 1000/power +------------------------------------------------------------------------ +local particle = "nc_lux_base.png^[mask:nc_lux_dot_mask.png^[opacity:32" +------------------------------------------------------------------------ +minetest.register_node(modname .. ":luxlamp_" .. id, { + description = desc.. " Luxlamp", + tiles = { + "nc_optics_glass_frost.png^(nc_lux_base.png^[opacity:" .. vlux .. ")^(nc_lode_annealed.png^[mask:" .. modname .. "_mask_lamp_top.png)", + "nc_lode_annealed.png", + "nc_optics_glass_frost.png^(nc_lux_base.png^[opacity:" .. vlux .. ")^(nc_lode_annealed.png^[mask:" .. modname .. "_mask_lamp_side.png)", + }, + drawtype = "nodebox", + paramtype = "light", + light_source = light, + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.3125, -0.3125, 0.3125, 0.25, 0.3125}, -- Core + {-0.5, -0.375, -0.5, 0.5, -0.25, 0.5}, -- Plate_Large + {-0.375, -0.4375, -0.375, 0.375, -0.375, 0.375}, -- Plate_Med + {-0.25, -0.5, -0.25, 0.25, -0.4375, 0.25}, -- Plate_Small + {-0.375, 0.25, -0.375, 0.375, 0.3125, 0.375}, -- Cap_Large + {-0.25, 0.3125, -0.25, 0.25, 0.375, 0.25}, -- Cap_Med + {-0.125, 0.375, -0.125, 0.125, 0.4375, 0.125}, -- Cap_Small + {-0.0625, 0.4375, -0.0625, 0.0625, 0.5, 0.0625}, -- Cap_Peak + } + }, + sunlight_propagates = true, + groups = { + stack_as_node = 1, + snappy = 1, + luxlamp = 1 + }, + stack_max = 1, + sounds = nodecore.sounds("nc_optics_glassy"), +}) +--------------------------------------- +-----------Luxlamp Crafting------------ +nodecore.register_craft({ + label = "assemble luxlamp", + action = "stackapply", + indexkeys = {"nc_lode:form"}, + wield = {name = "nc_optics:prism"}, + consumewield = 1, + nodes = { + {match = "nc_lode:form", replace = "air"}, + {y = 1, match = "nc_optics:lens", replace = "air"}, + {y = -1, match = "nc_lode:block_annealed", replace = modname .. ":luxlamp_0"}, + } + }) +--------------------------------------- +-----------Luxlamp Recycling----------- +nodecore.register_craft({ + label = "break luxlamp apart", + action = "pummel", + toolgroups = {choppy = 5}, + nodes = { + { + match = {groups = {luxlamp = true}}, + replace = "nc_optics:glass_crude" + } + }, + items = { + {name = "nc_lode:rod_tempered", count = 4, scatter = flux}, + {name = "nc_lux:flux_flowing", count = flux, scatter = flux} + }, + itemscatter = flux + }) + +--------------------------------------- +----------Luxlamp Diminishing---------- +nodecore.register_abm({ + label = "Luxlamp Delumination", + interval = charge, + chance = 1, + nodenames = {modname .. ":luxlamp_" .. id}, + action = function(pos) + if minetest.find_node_near(pos, + 1, {"nc_lux:flux_flowing"}) then + return false + end + if power > 0 then + return minetest.set_node(pos, {name = modname .. ":luxlamp_" .. delum}) + end + end + }) +--------------------------------------- +nodecore.register_aism({ + label = "Held Delumination", + interval = charge, + chance = 1, + itemnames = {modname .. ":luxlamp_" .. id}, + action = function(stack, data) + if power > 0 then + stack:set_name(modname .. ":luxlamp_" .. delum) + return stack + end + end + }) + +--------------------------------------- +-----------Luxlamp Charging------------ +nodecore.register_abm({ + label = "Luxlamp Effulgence", + nodenames = {"group:luxlamp"}, + neighbors = {"nc_lux:flux_source", "nc_lux:flux_flowing"}, + interval = time, + chance = 1, + action = function(pos) + nodecore.set_node(pos, {name = modname .. ":luxlamp_5"}) + end + }) + +--nodecore.register_abm({ +-- label = "Luxlamp Charging", +-- nodenames = {"group:luxlamp"}, +-- neighbors = {"nc_lux:flux_source", "nc_lux:flux_flowing"}, +-- interval = 2, --temporary, as a mysterious bug causes serious issue with this value +-- chance = 1, +-- action = function(pos) +-- if power > 4 then +-- nodecore.set_node(pos, {name = modname .. ":luxlamp_" .. flux}) +-- elseif 4 then return false +-- end +-- end +-- }) + +--------------------------------------- + +--------------------------------------- +end +luxlamp("Dull", "0", 0, 1) +luxlamp("Dim", "1", 1, 4) +luxlamp("Lambent", "2", 2, 8) +luxlamp("Radiant", "3", 3, 12) +luxlamp("Brilliant", "4", 4, 16) +luxlamp("Fulgent", "5", 5, 20) diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..e4d8cdf --- /dev/null +++ b/mod.conf @@ -0,0 +1,6 @@ +depends = nc_api_all, nc_fire, nc_optics, nc_lode, nc_lux, nc_flora +author = Winter94 +description = New light sources for NodeCore +name = wc_luminous +title = NodeCore Lights + diff --git a/rushlight.lua b/rushlight.lua new file mode 100644 index 0000000..8280328 --- /dev/null +++ b/rushlight.lua @@ -0,0 +1,209 @@ +-- LUALOCALS < --------------------------------------------------------- +local ItemStack, math, minetest, nodecore, pairs, setmetatable, vector + = ItemStack, math, minetest, nodecore, pairs, setmetatable, vector +local math_ceil, math_log, math_random + = math.ceil, math.log, math.random +-- LUALOCALS > --------------------------------------------------------- +local modname = minetest.get_current_modname() +local checkdirs = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 1, z = 0} +} +------------------------------------------------------------------------ +nodecore.candle_life_base = 30 +------------------------------------------------------------------------ +minetest.register_node(modname .. ":rushlight", { + description = "Rushlight", + drawtype = "mesh", + mesh = "nc_torch_torch.obj", + tiles = { + "nc_flora_wicker.png" + }, + backface_culling = false, + use_texture_alpha = "clip", + selection_box = nodecore.fixedbox(-1/8, -0.5, -1/8, 1/8, 0.5, 1/8), + collision_box = nodecore.fixedbox(-1/16, -0.5, -1/16, 1/16, 0.5, 1/16), + paramtype = "light", + sunlight_propagates = true, + groups = { + snappy = 1, + falling_repose = 1, + flammable = 1, + firestick = 2, + stack_as_node = 1 + }, + sounds = nodecore.sounds("nc_terrain_swishy"), + on_ignite = function(pos, node) + minetest.set_node(pos, {name = modname .. ":rushlight_lit"}) + nodecore.sound_play("nc_fire_ignite", {gain = 1, pos = pos}) + local expire = nodecore.gametime + nodecore.candle_life_base + * (nodecore.boxmuller() * 0.1 + 1) + minetest.get_meta(pos):set_float("expire", expire) + if node and node.count and node.count > 1 then + nodecore.item_disperse(pos, node.name, node.count - 1) + end + return true + end +}) +------------------------------------------------------------------------ +nodecore.register_craft({ + label = "assemble rushlight", + action = "pummel", + duration = 2, + indexkeys = {"nc_flora:rush_dry"}, + wield = {name = "nc_woodwork:staff"}, + consumewield = 1, + nodes = { + {match = {name = "nc_flora:rush_dry", count = 2}, replace = "air"} + }, + items = { + {name = modname .. ":rushlight"} + } + }) +------------------------------------------------------------------------ +nodecore.candle_life_stages = 4 +for i = 1, nodecore.candle_life_stages do + local alpha = (i - 1) * (256 / nodecore.candle_life_stages) + if alpha > 255 then alpha = 255 end + local txr = "nc_flora_wicker.png^nc_fire_ember_4.png^(nc_fire_ash.png^[opacity:" + .. alpha .. ")" + minetest.register_node(modname .. ":rushlight_lit_" .. i, { + description = "Lit Rushlight", + drawtype = "mesh", + mesh = "nc_torch_torch.obj", + tiles = { + txr, + "nc_flora_wicker.png", + txr .. "^[lowpart:50:nc_flora_wicker.png", + { + name = "nc_torch_flame.png", + animation = { + ["type"] = "vertical_frames", + aspect_w = 3, + aspect_h = 8, + length = 0.6 + } + } + }, + backface_culling = false, + use_texture_alpha = "clip", + selection_box = nodecore.fixedbox(-1/8, -0.5, -1/8, 1/8, 0.5, 1/8), + collision_box = nodecore.fixedbox(-1/16, -0.5, -1/16, 1/16, 0.5, 1/16), + paramtype = "light", + sunlight_propagates = true, + light_source = 6 - i, + groups = { + snappy = 1, + falling_repose = 1, + stack_as_node = 1, + candle_lit = 1, + flame_ambiance = 1 + --igniter = 1 + }, + stack_max = 1, + sounds = nodecore.sounds("nc_terrain_swishy"), + preserve_metadata = function(_, _, oldmeta, drops) + drops[1]:get_meta():from_table({fields = oldmeta}) + end, + after_place_node = function(pos, _, itemstack) + minetest.get_meta(pos):from_table(itemstack:get_meta():to_table()) + end, + node_dig_prediction = nodecore.dynamic_light_node(6 - i), + after_destruct = function(pos) + nodecore.dynamic_light_add(pos, 6 - i) + end + }) +end +------------------------------------------------------------------------ +minetest.register_abm({ + label = "rushlite ignite", + interval = 6, + chance = 1, + nodenames = {"group:candle_lit"}, + neighbors = {"group:flammable"}, + action_delay = true, + action = function(pos) + for _, ofst in pairs(checkdirs) do + local npos = vector.add(pos, ofst) + local nbr = minetest.get_node(npos) + if minetest.get_item_group(nbr.name, "flammable") > 0 + and not nodecore.quenched(npos) then + nodecore.fire_check_ignite(npos, nbr) + end + end + end + }) +------------------------------------------------------------------------ +local log2 = math_log(2) +local function candlelife(expire) + local max = nodecore.candle_life_stages + if expire <= nodecore.gametime then return max end + local life = (expire - nodecore.gametime) / nodecore.candle_life_base + if life > 1 then return 1 end + local stage = 1 - math_ceil(math_log(life) / log2) + if stage < 1 then return 1 end + if stage > max then return max end + return stage +end +------------------------------------------------------------------------ +minetest.register_abm({ + label = "candle snuff", + interval = 1, + chance = 1, + nodenames = {"group:candle_lit"}, + action = function(pos, node) + local expire = minetest.get_meta(pos):get_float("expire") or 0 + if nodecore.quenched(pos) or nodecore.gametime > expire then + minetest.remove_node(pos) + minetest.add_item(pos, {name = "nc_fire:lump_ash"}) + nodecore.sound_play("nc_fire_snuff", {gain = 1, pos = pos}) + return + end + local nn = modname .. ":rushlight_lit_" .. candlelife(expire) + if node.name ~= nn then + node.name = nn + return minetest.swap_node(pos, node) + end + end + }) +------------------------------------------------------------------------ +nodecore.register_aism({ + label = "rushlight stack interact", + itemnames = {"group:candle_lit"}, + action = function(stack, data) + local expire = stack:get_meta():get_float("expire") or 0 + if expire < nodecore.gametime then + nodecore.sound_play("nc_fire_snuff", {gain = 1, pos = data.pos}) + return "nc_fire:lump_ash" + end + + local pos = data.pos + local player = data.player + local wield + if player and data.list == "main" + and player:get_wield_index() == data.slot then + wield = true + pos = vector.add(pos, vector.multiply(player:get_look_dir(), 0.5)) + end + + if nodecore.quenched(pos, data.node and 1 or 0.3) then + nodecore.sound_play("nc_fire_snuff", {gain = 1, pos = pos}) + return "nc_fire:lump_ash" + end + + if wield and math_random() < 0.1 then nodecore.fire_check_ignite(pos) end + + local nn = modname .. ":rushlight_lit_" .. candlelife(expire) + if stack:get_name() ~= nn then + stack:set_name(nn) + return stack + end + end + }) +------------------------------------------------------------------------ +minetest.register_alias(modname .. ":rushlight_lit", modname .. ":rushlight_lit_1") +------------------------------------------------------------------------ + diff --git a/smoke.lua b/smoke.lua new file mode 100644 index 0000000..ceb9183 --- /dev/null +++ b/smoke.lua @@ -0,0 +1,52 @@ +-- LUALOCALS < --------------------------------------------------------- +local minetest, nodecore, math + = minetest, nodecore, math +-- LUALOCALS > --------------------------------------------------------- +local modname = minetest.get_current_modname() +------------------------------------------------------------------------ +local function smokey(posa, posb) + posb=posb or posa + local minpos = { + x = (posa.x < posb.x and posa.x or posb.x) - 0.25, + y = (posa.y < posb.y and posa.y or posb.y) - 0, + z = (posa.z < posb.z and posa.z or posb.z) - 0.25 + } + local maxpos = { + x = (posa.x > posb.x and posa.x or posb.x) + 0.25, + y = (posa.y > posb.y and posa.y or posb.y) + 0, + z = (posa.z > posb.z and posa.z or posb.z) + 0.25 + } + local volume = (maxpos.x - minpos.x + 1) * (maxpos.y - minpos.y + 1) + * (maxpos.z - minpos.z + 1) + minetest.add_particlespawner({ + amount = 3 * volume, + time = 10, + minpos = minpos, + maxpos = maxpos, + minvel = {x = -0.1, y = 0.25, z = -0.1}, + maxvel = {x = 0.1, y = 0.75, z = 0.1}, + texture = "nc_api_craft_smoke.png^[opacity:150", + minexptime = 2, + maxexptime = 12, + collisiondetection = true, + minsize = 1, + maxsize = 4 + }) +end +------------------------------------------------------------------------ +nodecore.register_abm({ + label = "particles:incense", + interval = 10, + chance = 1, + nodenames = {modname.. ":incense_lit"}, + action = function(pos) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local abnod = minetest.get_node(above) + local top = {x = pos.x, y = pos.y + 0.5, z = pos.z} + if abnod.name == "air" then + smokey(top) + end + end +}) + + diff --git a/sounds/license.txt b/sounds/license.txt new file mode 100644 index 0000000..44c143a --- /dev/null +++ b/sounds/license.txt @@ -0,0 +1,2 @@ +gas_hiss.1 is from https://freesound.org/people/wubitog/sounds/234782/ under the public domain (CC0) +gas_hiss.2 is from https://freesound.org/people/kgatto/sounds/240263/ by kgatto under the CC-BY-3.0 license diff --git a/sounds/wc_luminous_hissy.1.ogg b/sounds/wc_luminous_hissy.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a3b5f7beadefa56de5c50c271dec85b691553d98 GIT binary patch literal 19244 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 literal 0 HcmV?d00001 diff --git a/sounds/wc_luminous_hissy.2.ogg b/sounds/wc_luminous_hissy.2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4e8dfa26e96f175902bbfe064cdc7af2eb062825 GIT binary patch literal 28873 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Μ#UTC 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 literal 0 HcmV?d00001 diff --git a/textures/wc_luminous_fire_anim.png b/textures/wc_luminous_fire_anim.png new file mode 100644 index 0000000000000000000000000000000000000000..a849c2047de7c95bb825051e305fad67e01bc35f GIT binary patch literal 1411 zcmV-}1$_F6P)1ua+1F$2#7=Ai0YYeikT666N(U7xqzX{GKpjnYI`V0CG+N$clYE`vD>L9@aC8aF|nvjW%4k056*okAu@p!L&hpy^~8mZmGyE>cm zoZ)-FSLeVp3I7c2;Y&6fS1|13$TK6*;UT-a3rE0#XbxhjJ;>8T$n9frM2H*izTmf;fRmZ>~_@x#C3_Op;j_uX+&wAU z;B(6?MIUjpGmhuNNnG_>Eg(HtBKG|QMq@>M>K1NQM|Q}>;}$7dr#xRm2!`-zLtOl@ z`+s@lnVue1^T53Nf-U-{craH-U~w7uQ5lRLM6ZaRzlAGu7GlG&3$S|-F7`d12V$!P z?rvIkj>CZfrtctYQ)}#az8g7y63RC*_862yM-kJR>JF*^b5%mnu2Zs(;qlcYmHLS` z9EESMAUBoB7LVXRF@wA|O+Im`3aGYo#+g9d-Az#%ffk#D5~1w82?u3_W3ONbK$~j; z?_Rv2U@gF*Dmc}<_;-Vq)miDA!x;%u3gy_G`W<~2=_0cOlcZhSirs#QpS-eKnjl^fp-v%hU0OOr{q;#rDi zXbL$o96D{CDuU8VU8u<6FP0v!f?5nRa5=`pU6JLHMOt=x(JD>~1)b$$8PgU?=Ie3f zW_kaUSAnJfYn5ku3bg$`xOv{D@GC|AFz(e^XcdXig$eHtBTGZ1a{FmWEMPV2SmG&^ zxBq(FiAC2s73Xt!&0%m#&~lofSc0ek%@^=Y{tOWhLg+Mds=Dqrz+GyD(r;*b50WQ9 zX0R9BozzWFK#PT*>B8*|UM8`4skYKeWDr=~TGz8)YpFc>x0zaw@4gSh!Y) zsg;mKNG>JV_3mo~J69k*8=MA@NN=Z+vw8zYX#f>2E;-FAcQy Rw>SU*002ovPDHLkV1hv{oRk0n literal 0 HcmV?d00001 diff --git a/textures/wc_luminous_fuel_1.png b/textures/wc_luminous_fuel_1.png new file mode 100644 index 0000000000000000000000000000000000000000..07b9162733271c102d7296f608c852527e2d6b60 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfN-XS$)gT0feIKrUHx3vIVCg!07TFgC;$Ke literal 0 HcmV?d00001 diff --git a/textures/wc_luminous_fuel_10.png b/textures/wc_luminous_fuel_10.png new file mode 100644 index 0000000000000000000000000000000000000000..838cb29799666d0895a1a1ab3335ea66e695ef1c GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf&R3>?LA+_(fr=PBUHx3vIVCg!0KYmHz5oCK literal 0 HcmV?d00001 diff --git a/textures/wc_luminous_fuel_4.png b/textures/wc_luminous_fuel_4.png new file mode 100644 index 0000000000000000000000000000000000000000..34132929bf47264f3f3d5f049e376814645de5b3 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfO1$b_U0HtiK%tgH3=+7(8A5T-G@yGywpP#}?=S literal 0 HcmV?d00001 diff --git a/textures/wc_luminous_fuel_7.png b/textures/wc_luminous_fuel_7.png new file mode 100644 index 0000000000000000000000000000000000000000..a750d83cad1ebd2ac860bfa4e3049c849df82b74 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2I^w)boFyt I=akR{04!G^dH?_b literal 0 HcmV?d00001 diff --git a/textures/wc_luminous_mask_lamp_top.png b/textures/wc_luminous_mask_lamp_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0960448755369036421e18683186cb43dd618e69 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfo}P M)78&qol`;+0HTf|uK)l5 literal 0 HcmV?d00001 diff --git a/textures/wc_luminous_mask_lantern.png b/textures/wc_luminous_mask_lantern.png new file mode 100644 index 0000000000000000000000000000000000000000..8480608f1ead8d166bbf7a6a08d179d7ea3d645c GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfmdK II;Vst0FUDxX#fBK literal 0 HcmV?d00001 diff --git a/textures/wc_luminous_mask_pit.png b/textures/wc_luminous_mask_pit.png new file mode 100644 index 0000000000000000000000000000000000000000..586f095cc23af78a5c9fdb4d7d99b07f1b650fc2 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfX+V53mT#71>(^)WP8C>gTe~DWM4f DJ98V< literal 0 HcmV?d00001