diff --git a/mods/hudbars/init.lua b/mods/hudbars/init.lua index a07cc1af..e93633c6 100644 --- a/mods/hudbars/init.lua +++ b/mods/hudbars/init.lua @@ -3,7 +3,7 @@ local NS = function(s) return s end --- Boilerplate for compatibiliity with pre-5.9.0 +-- Boilerplate for compatibility with pre-5.9.0 -- versions of minetest local hud_def_type_field if minetest.features.hud_def_type_field then @@ -237,13 +237,7 @@ function hb.register_hudbar( local bar_image, bgicon, bar_size if hb.settings.bar_type == 'progress_bar' then bar_image = textures.bar - -- NOTE: Intentionally set to nil. For some reason, on some systems, - -- the progress bar is displaced when the bar_size is set explicitly here. - -- On the other hand, setting this to nil is deprecated in MT 5.0.0 due to - -- a debug log warning, but nothing is explained in lua_api.txt. - -- This section is a potential bug magnet, please watch with care! - -- The size of the bar image is expected to be exactly 2×16 pixels. - bar_size = nil + bar_size = { x = 2, y = 16 } elseif hb.settings.bar_type == 'statbar_classic' or hb.settings.bar_type == 'statbar_modern' then bar_image = textures.icon bgicon = textures.bgicon diff --git a/mods/libox b/mods/libox index 08d49da4..e160bab3 160000 --- a/mods/libox +++ b/mods/libox @@ -1 +1 @@ -Subproject commit 08d49da483cc56e8852ce9d941a57867e11074d1 +Subproject commit e160bab3c485610605247fef680b563093f9c138 diff --git a/mods/sbz_audio/init.lua b/mods/sbz_audio/init.lua index bb5a42c3..bcab534a 100644 --- a/mods/sbz_audio/init.lua +++ b/mods/sbz_audio/init.lua @@ -1,5 +1,6 @@ -- sbz_api.sounds is gone. Replace with sbz_audio wherever used. -sbz_audio = sbz_audio or {} +-- Ensure global exists without triggering undeclared-global warning +sbz_audio = rawget(_G, "sbz_audio") or {} -- Use as a template (include fade if needed on any) function sbz_audio.blank() diff --git a/mods/sbz_base/init.lua b/mods/sbz_base/init.lua index e8dcd33a..34a93af9 100644 --- a/mods/sbz_base/init.lua +++ b/mods/sbz_base/init.lua @@ -573,60 +573,56 @@ function sbz_api.punch(target, hitter, time_from_last_punch, tool_caps, dir) end end ---- Async is todo, and it wont be true async, just the function would be delayed, useful for something like a detonator ----@param pos vector ----@param power number ----@param r number ----@param async boolean -sbz_api.explode = function(pos, r, power, async, owner, extra_damage, knockback_strength, sound) - if async then - sbz_api.delay_if_laggy(function() - sbz_api.explode(pos, r, power, false, owner, extra_damage, knockback_strength, sound) - end) - return +local fib_cache = {} +-- refer to: https://stackoverflow.com/questions/9600801/evenly-distributing-n-points-on-a-sphere +local function fibonacci_sphere_points(samples) + if fib_cache[samples] then + return fib_cache[samples] end - extra_damage = extra_damage or power - knockback_strength = knockback_strength or 2.5 - owner = owner or '' - for _ = 1, 500 do - local raycast = core.raycast(pos, pos + vector.random_direction() * r, false, true) - local wear = 0 - for pointed in raycast do - if pointed.type == 'node' then - local target_pos = pointed.under - local nodename = core.get_node(target_pos).name - local ndef = core.registered_nodes[nodename] - if not ndef then break end - wear = wear + (1 / core.get_item_group(nodename, 'explody')) - --the explody group hence signifies roughly how many such nodes in a straight line it can break before stopping - --although this is very random - if wear > power or core.is_protected(target_pos, owner) then break end - if ndef.on_blast then - ndef.on_blast(target_pos, power, pos, owner, r) - else - core.set_node(target_pos, { name = ndef._exploded or 'air' }) - end - end - end + local points = {} + local phi = math.pi * (3 - math.sqrt(5)) + + for i = 0, samples - 1 do + local y = 1 - (i / (samples - 1)) * 2 + local radius = math.sqrt(math.max(0, 1 - y * y)) + local theta = phi * i + local x = math.cos(theta) * radius + local z = math.sin(theta) * radius + points[i + 1] = vector.new(x, y, z) end - for _, obj in ipairs(core.get_objects_inside_radius(pos, r)) do - -- this is all messed up - -- TODO: improve - local dir = obj:get_pos() - pos + + fib_cache[samples] = points + return points +end + +sbz_api._start_explosion = function(ctx) + local MAX_ENTITIES = 9 -- finely tuned by means of divine revelation + local entity_count = 0 + + -- Damage & knockback to objects + for _, obj in ipairs(core.get_objects_inside_radius(ctx.pos, math.sqrt(ctx.r))) do + if entity_count >= MAX_ENTITIES then + break + end + entity_count = entity_count + 1 + + local dir = obj:get_pos() - ctx.pos local len = vector.length(dir) + + if len == 0 then dir = vector.new(0, 1, 0) len = 0.01 end + if sbz_api.can_move_object(obj:get_armor_groups()) then - obj:add_velocity(vector.normalize(dir) * (r - vector.length(dir)) * knockback_strength) + obj:add_velocity(vector.normalize(dir) * (ctx.r - len) * ctx.knockback_strength) end -- this is intentional. HP is only removed when there is line of sight, but velocity is added anyway - if sbz_api.line_of_sight(pos, obj:get_pos()) == true then - local dmg = math.abs(vector.length(vector.normalize(dir) * (r - vector.length(dir))) * extra_damage) + if sbz_api.line_of_sight(ctx.pos, obj:get_pos()) then + local dmg = math.abs((ctx.r - len) * ctx.extra_damage) local groups = obj:get_armor_groups() local tool_caps = { full_punch_interval = 0, damage_groups = {}, } - -- pick whichever damage group is more protected if (groups.matter or 0) <= (groups.antimatter or 0) then tool_caps.damage_groups.matter = dmg @@ -637,15 +633,96 @@ sbz_api.explode = function(pos, r, power, async, owner, extra_damage, knockback_ sbz_api.punch(obj, nil, 100, tool_caps, dir) end end - if sound then + + if ctx.sound then core.sound_play('gen_explosion_with_reverb', { gain = 2.5, - max_hear_distance = 128, - pos = pos, + max_hear_distance = ctx.r * ctx.r, + pos = ctx.pos, }, true) end end +local function process_explosion_batch(ctx) + local batch_size = 50 + local processed = 0 + + while ctx.i <= ctx.total and processed < batch_size do + local dir = ctx.ray_dirs[ctx.i] + local raycast = core.raycast( + ctx.pos, + ctx.pos + dir * ctx.r, + false, + true + ) + + local wear = 0 + for pointed in raycast do + if pointed.type == 'node' then + local target_pos = pointed.under + local nodename = core.get_node(target_pos).name + local ndef = core.registered_nodes[nodename] + if not ndef then break end + + wear = wear + (1 / core.get_item_group(nodename, 'explody')) + --the explody group hence signifies roughly how many such nodes in a straight line it can break before stopping + --although this is very random + if wear > ctx.power or core.is_protected(target_pos, ctx.owner) then + break + end + + if ndef.on_blast then + ndef.on_blast(target_pos, ctx.power, ctx.pos, ctx.owner, ctx.r) + else + core.set_node(target_pos, { name = ndef._exploded or 'air' }) + end + end + end + + ctx.i = ctx.i + 1 + processed = processed + 1 + end + + if ctx.i <= ctx.total then + sbz_api.delay_if_laggy(function() + process_explosion_batch(ctx) + end) + end +end + +--- Async is todo, and it wont be true async, just the function would be delayed, useful for something like a detonator +---@param pos vector +---@param power number +---@param r number +---@param async boolean +sbz_api.explode = function(pos, r, power, async, owner, extra_damage, knockback_strength, sound) + local total_rays = math.min(math.pi * r * r, 3000) + + local ctx = { + pos = pos, + r = r, + power = power, + owner = owner or '', + extra_damage = extra_damage or power, + knockback_strength = knockback_strength or 2.5, + sound = sound, + i = 1, + total = total_rays, + ray_dirs = fibonacci_sphere_points(total_rays), + } + + if async then + sbz_api.delay_if_laggy(function() + sbz_api.explode(pos, r, power, false, owner, extra_damage, knockback_strength, sound) + end) + else + -- 1. Trigger the start effects (Damage, Sound, Knockback) + sbz_api._start_explosion(ctx) + -- 2. Batched raycasting for nodes + process_explosion_batch(ctx) + end +end + sbz_api.on_place_recharge = function(charge_per_1_wear, after) return function(stack, user, pointed) if pointed.type ~= 'node' then return end diff --git a/mods/sbz_progression/quests/Decorator.md b/mods/sbz_progression/quests/Decorator.md index cd45a553..75279a31 100644 --- a/mods/sbz_progression/quests/Decorator.md +++ b/mods/sbz_progression/quests/Decorator.md @@ -185,7 +185,7 @@ More fancy traditional bricks to build with. ### Meta -Requires: Clay +Requires: Dirt ## Mystery Terrarium diff --git a/mods/sbz_resources/bomb.lua b/mods/sbz_resources/bomb.lua index 58132567..204334e0 100644 --- a/mods/sbz_resources/bomb.lua +++ b/mods/sbz_resources/bomb.lua @@ -153,3 +153,99 @@ core.register_node("sbz_resources:bomb", { core.add_entity(pos, "sbz_resources:bomb_entity", owner) end }) + +local function fission_bomb_detonate(obj, owner) + sbz_api.explode(obj:get_pos(), 256, 0.9, true, owner or "", 2.5, nil, true) + obj:remove() +end + +local fission_time = 5 + +core.register_entity("sbz_resources:fission_bomb_entity", { + initial_properties = { + physical = true, + collide_with_objects = false, + visual = "cube", + textures = { + "fission_bomb_top.png^[brighten", + "fission_bomb_top.png^[brighten", + "fission_bomb.png^[brighten", + "fission_bomb.png^[brighten", + "fission_bomb.png^[brighten", + "fission_bomb.png^[brighten", + }, + static_save = false, + pointable = true + }, + + on_activate = function(self, staticdata) + self.object:set_armor_groups({ immortal = 1, can_move = 1 }) + self.time = fission_time + self.owner = staticdata + self.object:add_velocity(vector.new(0, 1, 0)) + self.object:set_acceleration(vector.new(0, -sbz_api.gravity, 0)) + end, + + on_step = function(self, dtime, moveresult) + self.time = self.time - dtime + self.object:set_acceleration(vector.new(0, -sbz_api.gravity, 0)) + + if moveresult.touching_ground or moveresult.standing_on_object then + self.object:set_velocity(self.object:get_velocity() * 0.9) + end + + if self.time <= 0 then + fission_bomb_detonate(self.object, self.owner) + end + end, +}) + +core.register_node("sbz_resources:fission_bomb", { + description = "Fission Bomb", + tiles = { + "fission_bomb_top.png", + "fission_bomb_top.png", + "fission_bomb.png" + }, + groups = { matter = 1, explody = 100 }, + sounds = { + footstep = { name = 'gen_full_container_thunk', gain = 0.2, pitch = 0.5 }, + dig = { name = 'gen_pew_waveform', gain = 0.2, pitch = 0.1 }, + dug = { name = 'gen_pew_flange', gain = 1.0, pitch = 1.0 }, + place = { name = 'gen_full_container_thunk', gain = 0.7, pitch = 1.0 }, + }, + + on_rightclick = function(pos, node, player) + local name = player:get_player_name() + + if core.is_protected(pos, name) then + return core.record_protection_violation(pos, name) + end + + core.remove_node(pos) + core.add_entity(pos, "sbz_resources:fission_bomb_entity", name) + + core.sound_play("gen_noise_fuse", { + pos = pos, + gain = 1.2, + fade = 10.0, + pitch = 0.8, -- deeper sound? + }) + end, + + on_blast = function(pos, power, original_pos, owner) + if core.is_protected(pos, owner) then return end + + core.remove_node(pos) + core.add_entity(pos, "sbz_resources:fission_bomb_entity", owner) + end +}) + +core.register_craft({ + output = "sbz_resources:fission_bomb", + recipe = { + { "sbz_resources:bomb", "sbz_chem:lead_block", "sbz_resources:bomb" }, + { "sbz_resources:heating_element", "sbz_chem:plutonium_fuel_rod", "sbz_resources:heating_element" }, + { "sbz_resources:bomb", "sbz_chem:lead_block", "sbz_resources:bomb" } + } +}) diff --git a/mods/sbz_resources/textures/fission_bomb.png b/mods/sbz_resources/textures/fission_bomb.png new file mode 100644 index 00000000..30e16820 Binary files /dev/null and b/mods/sbz_resources/textures/fission_bomb.png differ diff --git a/mods/sbz_resources/textures/fission_bomb_top.png b/mods/sbz_resources/textures/fission_bomb_top.png new file mode 100644 index 00000000..6cc38c52 Binary files /dev/null and b/mods/sbz_resources/textures/fission_bomb_top.png differ diff --git a/mods/sbz_resources/wormhole.lua b/mods/sbz_resources/wormhole.lua index 7aacac41..52da76a4 100644 --- a/mods/sbz_resources/wormhole.lua +++ b/mods/sbz_resources/wormhole.lua @@ -104,6 +104,7 @@ sbz_api.recipe.register_craft { items = { "sbz_resources:unrefined_firmament", "sbz_resources:gravitational_lens", + "", }, } diff --git a/mods/unifieddyes/airbrush.lua b/mods/unifieddyes/airbrush.lua index 815d3737..8838748e 100644 --- a/mods/unifieddyes/airbrush.lua +++ b/mods/unifieddyes/airbrush.lua @@ -24,60 +24,78 @@ with this program; if not, see . ]=] local function sheet(t, sx, sy, x, y) - sx = sx + 1 - sy = sy + 1 return ("%s^[sheet:%sx%s:%s,%s"):format(t, sx, sy, x, y) end +-- cols/rows: tile counts in the source image +-- leftover: missing tiles from the last row local palette_sizes = { - ["unifieddyes_palette_colorfacedir.png"] = vector.new(8, 1, 0), -- im using vectors cuz z will be "how much is left off the last row" if that makes sense - ["unifieddyes_palette_extended.png"] = vector.new(24, 11, 8), - ["unifieddyes_palette_colorwallmounted.png"] = vector.new(8, 4, 0), + ["unifieddyes_palette_colorfacedir.png"] = { cols = 8, rows = 1, leftover = 0 }, + ["unifieddyes_palette_extended.png"] = { cols = 256, rows = 1, leftover = 0 }, + ["unifieddyes_palette_colorwallmounted.png"] = { cols = 8, rows = 4, leftover = 0 }, } -for k, v in pairs(palette_sizes) do - palette_sizes[k] = vector.subtract(v, vector.new(1, 1, 1)) -end - local function show_fs(user, palette) local size = palette_sizes[palette] if size == nil then - minetest.chat_send_player(user:get_player_name(), "Node not supported!") + core.chat_send_player(user:get_player_name(), "Node not supported!") return end - local button_size = 0.8 + local button_size = 0.8 local button_spacing = 0.9 + local wrap = 24 -- columns to wrap 1D palettes into + local is_strip = (size.rows == 1) + local total = size.cols * size.rows - size.leftover + + local display_cols, display_rows + if is_strip then + display_cols = math.min(total, wrap) + display_rows = math.ceil(total / wrap) + else + display_cols = size.cols + display_rows = size.rows + end local fs = { ([[ formspec_version[7] size[%s,%s] - ]]):format((size.x * button_spacing) + 1.2, 1.2 + (size.y * button_spacing)), -- 1.5 spacing for the rest + ]]):format( + ((display_cols - 1) * button_spacing) + 1.2, + ((display_rows - 1) * button_spacing) + 1.2 + ), } local head = #fs + 1 - local idx = 0 - - for y = 0, size.y do - for x = 0, size.x do - idx = idx + 1 - if y == size.y and x >= (size.x - size.z) then - break - end - fs[head] = string.format("image_button[%s,%s;%s,%s;%s;%s;]", - (x * button_spacing) + 0.2, (y * button_spacing) + 0.2, - button_size, button_size, - minetest.formspec_escape(sheet(palette, size.x, size.y, x, y)), idx) - head = head + 1 + for idx = 0, total - 1 do + local src_x, src_y, screen_x, screen_y + if is_strip then + src_x, src_y = idx, 0 + screen_x = idx % wrap + screen_y = math.floor(idx / wrap) + else + src_x = idx % size.cols + src_y = math.floor(idx / size.cols) + screen_x, screen_y = src_x, src_y end + + fs[head] = string.format( + "image_button[%s,%s;%s,%s;%s;%s;]", + (screen_x * button_spacing) + 0.2, + (screen_y * button_spacing) + 0.2, + button_size, button_size, + core.formspec_escape(sheet(palette, size.cols, size.rows, src_x, src_y)), + idx + 1 + ) + head = head + 1 end - minetest.show_formspec(user:get_player_name(), "color_dialog", - table.concat(fs)) + core.show_formspec(user:get_player_name(), "color_dialog", table.concat(fs)) end -minetest.register_on_player_receive_fields(function(player, formname, fields) + +core.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "color_dialog" then return end local wield_item = player:get_wielded_item() @@ -91,8 +109,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) wield_item:get_meta():set_int("selected_index", idx) player:set_wielded_item(wield_item) - minetest.chat_send_player(player:get_player_name(), "Updated the tool succesfully") - minetest.show_formspec(player:get_player_name(), "color_dialog", "") + core.chat_send_player(player:get_player_name(), "Updated the tool succesfully") + core.show_formspec(player:get_player_name(), "color_dialog", "") end) _G.show_fs = show_fs @@ -102,10 +120,10 @@ _G.show_fs = show_fs local function load_into(stack, player, pointed) if pointed.type ~= "node" then return end local pos = pointed.under - local n = minetest.get_node(pos) - local def = minetest.registered_nodes[n.name] or {} + local n = core.get_node(pos) + local def = core.registered_nodes[n.name] or {} if not palette_sizes[def.palette or "no"] then - minetest.chat_send_player(player:get_player_name(), "Node not supported!") + core.chat_send_player(player:get_player_name(), "Node not supported!") return end show_fs(player, def.palette) @@ -116,8 +134,8 @@ end local function color_block(stack, player, pointed) if pointed.type ~= "node" then return end local pos = pointed.under - if minetest.is_protected(pos, player:get_player_name()) then - minetest.chat_send_player(player:get_player_name(), + if core.is_protected(pos, player:get_player_name()) then + core.chat_send_player(player:get_player_name(), "PROTECTED!!!!!") return end @@ -127,24 +145,24 @@ local function color_block(stack, player, pointed) local pinv = player:get_inventory() if not pinv:contains_item("main", "unifieddyes:colorium 1") then - minetest.chat_send_player(player:get_player_name(), "You don't have the required colorium") + core.chat_send_player(player:get_player_name(), "You don't have the required colorium") return end - local n = minetest.get_node(pos) - local def = minetest.registered_nodes[n.name] or {} + local n = core.get_node(pos) + local def = core.registered_nodes[n.name] or {} local pal = def.palette local meta = stack:get_meta() local stack_pal = meta:get_string("palette") if pal ~= stack_pal then - minetest.chat_send_player(player:get_player_name(), "Palette mismatch, need to re-configure again") + core.chat_send_player(player:get_player_name(), "Palette mismatch, need to re-configure again") return load_into(stack, player, pointed) end local indx = meta:get_int("selected_index") local paramtype = def.paramtype2 local rotation = 0 - rotation = n.param2 - minetest.strip_param2_color(n.param2, paramtype) + rotation = n.param2 - core.strip_param2_color(n.param2, paramtype) local mul = 1 if paramtype == "colorfacedir" then @@ -157,12 +175,12 @@ local function color_block(stack, player, pointed) mul = 32 end indx = indx - 1 - minetest.swap_node(pos, { name = n.name, param2 = rotation + (math.floor(indx * mul)) }) + core.swap_node(pos, { name = n.name, param2 = rotation + (math.floor(indx * mul)) }) pinv:remove_item("main", "unifieddyes:colorium 1") end -minetest.register_tool("unifieddyes:coloring_tool", { +core.register_tool("unifieddyes:coloring_tool", { description = "Coloring Tool", inventory_image = "color_tool.png", liquids_pointable = false, -- colorable liquids probably wont exist but they would be funny diff --git a/mods/unifieddyes/api.lua b/mods/unifieddyes/api.lua index 7cd27347..82b668f5 100644 --- a/mods/unifieddyes/api.lua +++ b/mods/unifieddyes/api.lua @@ -35,8 +35,8 @@ unifieddyes.player_showall = {} -- but the itemstack used to place it has no palette_index (color byte), -- create something appropriate to make it officially white. -minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - local def = minetest.registered_items[newnode.name] +core.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + local def = core.registered_items[newnode.name] if not def or not def.palette or def.after_place_node or not placer then return false end @@ -54,8 +54,8 @@ minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack end if param2 and not (core.get_item_group(newnode.name, 'falling_node') == 1) then - minetest.swap_node(pos, { name = newnode.name, param2 = param2 }) - minetest.get_meta(pos):set_int('palette_index', color) + core.swap_node(pos, { name = newnode.name, param2 = param2 }) + core.get_meta(pos):set_int('palette_index', color) end end end) @@ -70,23 +70,23 @@ local function node_dig_without_color(pos, node, digger) local def = ItemStack(node.name):get_definition() -- Copy pos because the callback could modify it if not def.diggable or (def.can_dig and not def.can_dig(vector.copy(pos), digger)) then - minetest.log( + core.log( 'info', - diggername .. ' tried to dig ' .. node.name .. ' which is not diggable ' .. minetest.pos_to_string(pos) + diggername .. ' tried to dig ' .. node.name .. ' which is not diggable ' .. core.pos_to_string(pos) ) return false end - if minetest.is_protected(pos, diggername) then - minetest.log( + if core.is_protected(pos, diggername) then + core.log( 'action', - diggername .. ' tried to dig ' .. node.name .. ' at protected position ' .. minetest.pos_to_string(pos) + diggername .. ' tried to dig ' .. node.name .. ' at protected position ' .. core.pos_to_string(pos) ) - minetest.record_protection_violation(pos, diggername) + core.record_protection_violation(pos, diggername) return false end - minetest.log('action', diggername .. ' digs ' .. node.name .. ' at ' .. minetest.pos_to_string(pos)) + core.log('action', diggername .. ' digs ' .. node.name .. ' at ' .. core.pos_to_string(pos)) local wielded = digger and digger:get_wielded_item() local drops = { node.name } -- this is instead of asking minetest to generate the node drops @@ -94,15 +94,15 @@ local function node_dig_without_color(pos, node, digger) if wielded then local wdef = wielded:get_definition() local tp = wielded:get_tool_capabilities() - local dp = minetest.get_dig_params(def and def.groups, tp, wielded:get_wear()) + local dp = core.get_dig_params(def and def.groups, tp, wielded:get_wear()) if wdef and wdef.after_use then wielded = wdef.after_use(wielded, digger, node, dp) or wielded else -- Wear out tool - if not minetest.is_creative_enabled(diggername) then + if not core.is_creative_enabled(diggername) then wielded:add_wear(dp.wear) if wielded:get_count() == 0 and wdef.sound and wdef.sound.breaks then - minetest.sound_play(wdef.sound.breaks, { + core.sound_play(wdef.sound.breaks, { pos = pos, gain = 0.5, }, true) @@ -114,7 +114,7 @@ local function node_dig_without_color(pos, node, digger) -- Check to see if metadata should be preserved. if def and def.preserve_metadata then - local oldmeta = minetest.get_meta(pos):to_table().fields + local oldmeta = core.get_meta(pos):to_table().fields -- Copy pos and node because the callback can modify them. local pos_copy = vector.copy(pos) local node_copy = { name = node.name, param1 = node.param1, param2 = node.param2 } @@ -127,17 +127,17 @@ local function node_dig_without_color(pos, node, digger) end -- Handle drops - minetest.handle_node_drops(pos, drops, digger) + core.handle_node_drops(pos, drops, digger) local oldmetadata - if def and def.after_dig_node then oldmetadata = minetest.get_meta(pos):to_table() end + if def and def.after_dig_node then oldmetadata = core.get_meta(pos):to_table() end -- Remove node and update - minetest.remove_node(pos) + core.remove_node(pos) -- Play sound if it was done by a player if diggername ~= '' and def and def.sounds and def.sounds.dug then - minetest.sound_play(def.sounds.dug, { + core.sound_play(def.sounds.dug, { pos = pos, exclude_player = diggername, }, true) @@ -152,9 +152,9 @@ local function node_dig_without_color(pos, node, digger) end -- Run script hook - for _, callback in ipairs(minetest.registered_on_dignodes) do - local origin = minetest.callback_origins[callback] - minetest.set_last_run_mod(origin.mod) + for _, callback in ipairs(core.registered_on_dignodes) do + local origin = core.callback_origins[callback] + core.set_last_run_mod(origin.mod) -- Copy pos and node because callback can modify them local pos_copy = vector.copy(pos) @@ -166,15 +166,15 @@ local function node_dig_without_color(pos, node, digger) end function unifieddyes.on_dig(pos, node, digger) - local param2 = minetest.get_node(pos).param2 - local def = minetest.registered_items[node.name] + local param2 = core.get_node(pos).param2 + local def = core.registered_items[node.name] local del_color if def.paramtype2 == 'color' and param2 == 240 and def.palette == 'unifieddyes_palette_extended.png' then del_color = true elseif (def.paramtype2 == 'colorwallmounted' or def.paramtype2 == 'colorfacedir') - and minetest.strip_param2_color(param2, def.paramtype2) == 0 + and core.strip_param2_color(param2, def.paramtype2) == 0 and string.find(def.palette, 'unifieddyes_palette_') then del_color = true @@ -183,7 +183,7 @@ function unifieddyes.on_dig(pos, node, digger) if del_color then return node_dig_without_color(pos, node, digger) else - return minetest.node_dig(pos, node, digger) + return core.node_dig(pos, node, digger) end end @@ -220,7 +220,7 @@ function unifieddyes.generate_split_palette_nodes(name, def, drop) } end - minetest.register_node(':' .. name .. '_' .. color, def2) + core.register_node(':' .. name .. '_' .. color, def2) end end @@ -250,10 +250,10 @@ local function register_c(craft, h, sat, val) end local dye = 'dye:' .. color - local recipe = minetest.serialize(craft.recipe) + local recipe = core.serialize(craft.recipe) recipe = string.gsub(recipe, 'MAIN_DYE', dye) recipe = string.gsub(recipe, 'NEUTRAL_NODE', craft.neutral_node) - local newrecipe = minetest.deserialize(recipe) + local newrecipe = core.deserialize(recipe) local coutput = craft.output or '' local output = coutput @@ -274,7 +274,7 @@ local function register_c(craft, h, sat, val) local colored_itemstack = unifieddyes.make_colored_itemstack(output, craft.palette, dye) - minetest.register_craft { + core.register_craft { output = colored_itemstack, type = craft.type, recipe = newrecipe, @@ -318,34 +318,34 @@ end -- call this function to reset the rotation of a "wallmounted" object on place function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) + local node = core.get_node(pos) local colorbits = node.param2 - (node.param2 % 8) local yaw = placer:get_look_horizontal() - local dir = minetest.yaw_to_dir(yaw) -- -1.5) + local dir = core.yaw_to_dir(yaw) -- -1.5) local pitch = placer:get_look_vertical() - local fdir = minetest.dir_to_wallmounted(dir) + local fdir = core.dir_to_wallmounted(dir) if pitch < -(math.pi / 8) then fdir = 0 elseif pitch > math.pi / 8 then fdir = 1 end - minetest.swap_node(pos, { name = node.name, param2 = fdir + colorbits }) + core.swap_node(pos, { name = node.name, param2 = fdir + colorbits }) end -- use this when you have a "wallmounted" node that should never be oriented -- to floor or ceiling... function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) + local node = core.get_node(pos) local colorbits = node.param2 - (node.param2 % 8) local yaw = placer:get_look_horizontal() - local dir = minetest.yaw_to_dir(yaw + 1.5) - local fdir = minetest.dir_to_wallmounted(dir) + local dir = core.yaw_to_dir(yaw + 1.5) + local fdir = core.dir_to_wallmounted(dir) - minetest.swap_node(pos, { name = node.name, param2 = fdir + colorbits }) + core.swap_node(pos, { name = node.name, param2 = fdir + colorbits }) end -- ... and use this one to force that kind of node off of floor/ceiling @@ -356,16 +356,16 @@ function unifieddyes.fix_after_screwdriver_nsew(pos, node, user, mode, new_param local color = new_param2 - new_fdir if new_fdir < 2 then new_fdir = 2 - minetest.swap_node(pos, { name = node.name, param2 = new_fdir + color }) + core.swap_node(pos, { name = node.name, param2 = new_fdir + color }) return true end end function unifieddyes.is_buildable_to(placer_name, ...) for _, pos in ipairs { ... } do - local node = minetest.get_node_or_nil(pos) - local def = node and minetest.registered_nodes[node.name] - if not (def and def.buildable_to) or minetest.is_protected(pos, placer_name) then return false end + local node = core.get_node_or_nil(pos) + local def = node and core.registered_nodes[node.name] + if not (def and def.buildable_to) or core.is_protected(pos, placer_name) then return false end end return true end @@ -503,7 +503,7 @@ function unifieddyes.get_color_from_dye_name(name) elseif name == 'dye:white' then return 'ffffff' end - local item = minetest.registered_items[name] + local item = core.registered_items[name] if not item then return end local inv_image = item.inventory_image if not inv_image then return end diff --git a/mods/unifieddyes/init.lua b/mods/unifieddyes/init.lua index 6e7eae05..ea9b4d5d 100644 --- a/mods/unifieddyes/init.lua +++ b/mods/unifieddyes/init.lua @@ -36,7 +36,7 @@ with this program; if not, see . unifieddyes = {} -local modpath = minetest.get_modpath(minetest.get_current_modname()) +local modpath = core.get_modpath(core.get_current_modname()) dofile(modpath .. "/color-tables.lua") dofile(modpath .. "/api.lua") diff --git a/mods/unifieddyes/textures/unifieddyes_palette_extended.png b/mods/unifieddyes/textures/unifieddyes_palette_extended.png index 596e5e38..06c5f938 100644 Binary files a/mods/unifieddyes/textures/unifieddyes_palette_extended.png and b/mods/unifieddyes/textures/unifieddyes_palette_extended.png differ