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