From 5f02326a80c7efec6fa69953f3f0670f816b9a58 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 21 Jul 2025 21:40:47 +0300 Subject: [PATCH 1/6] hide unsafe debug.* functions --- res/scripts/stdlib.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 8915c2b1..0765199e 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -523,6 +523,15 @@ function time.post_runnable(runnable) table.insert(__post_runnables, runnable) end +-- Hide unsafe debug.* functions +local removed_names = { + "getregistry", "getupvalue", "setupvalue", "upvalueid", "upvaluejoin", + "sethook", "gethook", "getinfo" +} +for i, name in ipairs(removed_names) do + debug[name] = nil +end + -- --------- Deprecated functions ------ -- local function wrap_deprecated(func, name, alternatives) return function (...) From 6d019fbc8d0280d5f916cc360308fabaf0975351 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 21 Jul 2025 21:51:49 +0300 Subject: [PATCH 2/6] temporary fix: precipitation brightness compensation --- src/graphics/render/PrecipitationRenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/render/PrecipitationRenderer.cpp b/src/graphics/render/PrecipitationRenderer.cpp index 42dc3115..68c955c3 100644 --- a/src/graphics/render/PrecipitationRenderer.cpp +++ b/src/graphics/render/PrecipitationRenderer.cpp @@ -149,7 +149,7 @@ void PrecipitationRenderer::render( glm::cross(glm::vec3(0, 1, 0), face.right), FACE_SIZE, light_at(chunks, pos.x, y, pos.z), - glm::vec3(1.0f), + glm::vec3(2.0f), calc_uv(pos, face.right, timer, weather) ); } From af2dcbbc3fe3c3de250ae62a7267f8ddeb5fc891 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 21 Jul 2025 21:52:57 +0300 Subject: [PATCH 3/6] fix initial weather intensity --- src/presets/WeatherPreset.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/presets/WeatherPreset.hpp b/src/presets/WeatherPreset.hpp index b3fa5db2..e49d1f3c 100644 --- a/src/presets/WeatherPreset.hpp +++ b/src/presets/WeatherPreset.hpp @@ -58,7 +58,7 @@ struct WeatherPreset : Serializable { float thunderRate = 0.0f; /// @brief Weather effects intensity - float intensity = 1.0f; + float intensity = 0.0f; dv::value serialize() const override; void deserialize(const dv::value& src) override; From 60bc30f01fcd1d40fa59ce760b260bec4430d809 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 21 Jul 2025 22:04:57 +0300 Subject: [PATCH 4/6] fix --- res/scripts/stdmin.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index c7fa43c2..9f8c48c2 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -461,10 +461,12 @@ function file.readlines(path) return lines end +local _debug_getinfo = debug.getinfo + function debug.count_frames() local frames = 1 while true do - local info = debug.getinfo(frames) + local info = _debug_getinfo(frames) if info then frames = frames + 1 else @@ -477,7 +479,7 @@ function debug.get_traceback(start) local frames = {} local n = 2 + (start or 0) while true do - local info = debug.getinfo(n) + local info = _debug_getinfo(n) if info then table.insert(frames, info) else @@ -567,7 +569,7 @@ end function require(path) if not string.find(path, ':') then - local prefix, _ = parse_path(debug.getinfo(2).source) + local prefix, _ = parse_path(_debug_getinfo(2).source) return require(prefix..':'..path) end local prefix, file = parse_path(path) From 0a79f672f3e37d1338375ca1f6f7857f165fe4ca Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 21 Jul 2025 23:13:15 +0300 Subject: [PATCH 5/6] fix drop component --- res/content/base/scripts/components/drop.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/res/content/base/scripts/components/drop.lua b/res/content/base/scripts/components/drop.lua index 4995aee4..a979c72d 100644 --- a/res/content/base/scripts/components/drop.lua +++ b/res/content/base/scripts/components/drop.lua @@ -64,8 +64,12 @@ function on_sensor_enter(index, oid) local odrop = other:get_component("base:drop").dropitem if odrop.id == dropitem.id and not odrop.data then local stack = item.stack_size(dropitem.id) - local sum = dropitem.count + odrop.count - if sum <= stack then + local sum = (dropitem.count or 0) + (odrop.count or 0) + if sum == 0 then + dropitem:despawn(); + odrop:despawn(); + return + elseif sum <= stack then dropitem.count = 0 odrop.count = sum entity:despawn() From 82f777229eb3d7622ab339843d6f7628b2dfcebc Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 21 Jul 2025 23:36:40 +0300 Subject: [PATCH 6/6] fix: sampler arrays inbdexed with non-constant / uniform-based expressions are forbidden --- res/shaders/lib/shadows.glsl | 37 ++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/res/shaders/lib/shadows.glsl b/res/shaders/lib/shadows.glsl index db37cdaa..6fede28b 100644 --- a/res/shaders/lib/shadows.glsl +++ b/res/shaders/lib/shadows.glsl @@ -10,20 +10,19 @@ uniform int u_shadowsRes; uniform float u_shadowsOpacity; uniform float u_shadowsSoftness; -float calc_shadow(vec4 modelPos, vec3 realnormal, float distance) { -#ifdef ENABLE_SHADOWS +float calc_shadow( + sampler2DShadow shadowsMap, + mat4 shadowMatrix, + vec4 modelPos, + vec3 realnormal, + vec3 normalOffset, + float bias +) { float step = 1.0 / float(u_shadowsRes); - float s = pow(abs(cos(u_dayTime * PI2)), 0.25) * u_shadowsOpacity; - vec3 normalOffset = realnormal * (distance > 64.0 ? 0.2 : 0.04); - int shadowIdx = distance > 80.0 ? 1 : 0; - - vec4 mpos = u_shadowsMatrix[shadowIdx] * vec4(modelPos.xyz + normalOffset, 1.0); + vec4 mpos = shadowMatrix * vec4(modelPos.xyz + normalOffset, 1.0); vec3 projCoords = mpos.xyz / mpos.w; projCoords = projCoords * 0.5 + 0.5; - projCoords.z -= 0.00001 / u_shadowsRes; - if (shadowIdx > 0) { - projCoords.z -= 0.001; - } + projCoords.z -= 0.00001 / u_shadowsRes + bias; float shadow = 0.0; if (dot(realnormal, u_sunDir) < 0.0) { @@ -31,13 +30,27 @@ float calc_shadow(vec4 modelPos, vec3 realnormal, float distance) { for (int y = -1; y <= 1; y++) { for (int x = -1; x <= 1; x++) { vec3 offset = vec3(x, y, -(abs(x) + abs(y)) * 0.8) * step * 1.0 * u_shadowsSoftness; - shadow += texture(u_shadows[shadowIdx], projCoords + offset); + shadow += texture(shadowsMap, projCoords + offset); } } shadow /= 9.0; } else { shadow = 0.5; } + return shadow; +} + +// TODO: add array textures support +float calc_shadow(vec4 modelPos, vec3 realnormal, float distance) { +#ifdef ENABLE_SHADOWS + float s = pow(abs(cos(u_dayTime * PI2)), 0.25) * u_shadowsOpacity; + vec3 normalOffset = realnormal * (distance > 64.0 ? 0.2 : 0.04); + + // as slow as mix(...) + float shadow = (distance < 80.0) + ? calc_shadow(u_shadows[0], u_shadowsMatrix[0], modelPos, realnormal, normalOffset, 0.0) + : calc_shadow(u_shadows[1], u_shadowsMatrix[1], modelPos, realnormal, normalOffset, 0.001); + return 0.5 * (1.0 + s * shadow); #else return 1.0;