From 29791049310e733562bd80123c5a5afd624358e2 Mon Sep 17 00:00:00 2001 From: min Date: Tue, 9 Jun 2026 20:09:07 +0300 Subject: [PATCH] =?UTF-8?q?fix(g16):=20=D1=83=D1=80=D0=BE=D0=BD=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0?= =?UTF-8?q?=20=D0=B8=D0=B3=D1=80=D0=BE=D0=BA=20=D0=A0=D0=95=D0=90=D0=9B?= =?UTF-8?q?=D0=AC=D0=9D=D0=9E=20=D0=B2=20=D0=BB=D0=B0=D0=B2=D0=B5=20(?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=B4=20=D0=BE=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=BE=D0=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше: фильтр по Y-капсулы не работал — игрок стоит на островке на realPos.y=1.54 > порога 1.35, фильтр пропускал. Стало: проверяем где игрок по X/Z. Если над островком (любой из 6) или над финишной площадкой — пропускаем урон. Иначе — урон каждый кадр пока Touched активно (RunService.Heartbeat). У damage есть i-frames ~0.5с так что урон ~2/сек. Также: переход с Touched-разово на Heartbeat-постоянно. Раньше Touched срабатывал только при ВХОДЕ в лаву — если игрок стоит в лаве долго, TouchEnded не вызывался, и урон шёл только раз. Теперь Touched/TouchEnded выставляют inLava-флаг, Heartbeat считает урон каждый кадр. --- src/community/docsGamesBuildersLua.js | 51 ++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/src/community/docsGamesBuildersLua.js b/src/community/docsGamesBuildersLua.js index aefa765..50a908d 100644 --- a/src/community/docsGamesBuildersLua.js +++ b/src/community/docsGamesBuildersLua.js @@ -1396,21 +1396,56 @@ end)`, g16_lava: `-- === Скрипт лавы (Lua) === -- Игрок коснулся лавы — урон. У damage есть защита (i-frames), -- так что урон не каждый кадр, а раз в ~0.5 секунды. --- ВАЖНО: лава-зона может пересекаться с островками по AABB. Проверяем --- что игрок РЕАЛЬНО внизу (стоит в лаве), а не на островке выше. +-- ВАЖНО: проверяем что игрок НЕ над островком (по X/Z), +-- иначе урон срабатывает на островке из-за пересечения AABB. +local RunService = game:GetService("RunService") local part = script.Parent local hitSound = Instance.new("Sound", part) hitSound.SoundId = "hit"; hitSound.Volume = 0.7 +-- Координаты островков (из builder): { x, z } +local ISLES = { + {0, 5}, {3, 9}, {-2, 13}, {2, 17}, {-3, 21}, {1, 25}, +} +local ISLE_HW = 1.4 -- половина ширины островка sx=2.4/2 + небольшой запас +local FINISH_X, FINISH_Z = -0.5, 29 +local FINISH_HW, FINISH_HD = 3, 2.5 + +local function isOverSafeSpot() + local px = __rbxl_player_x() + local pz = __rbxl_player_z() + -- Островки + for _, isle in ipairs(ISLES) do + if math.abs(px - isle[1]) <= ISLE_HW + and math.abs(pz - isle[2]) <= ISLE_HW then + return true + end + end + -- Финишная площадка + if math.abs(px - FINISH_X) <= FINISH_HW + and math.abs(pz - FINISH_Z) <= FINISH_HD then + return true + end + return false +end + +-- Проверяем каждый кадр пока игрок касается лавы — наносим урон если он +-- НЕ над безопасным местом. Touched нам не нужен — лучше Heartbeat-проверка. +local inLava = false part.Touched:Connect(function(hit) local h = hit.Parent and hit.Parent:FindFirstChild("Humanoid") if not h then return end - -- Игрок на безопасной высоте (на островке/финише) — не урон. - -- Лава-зона на y=1, верх y=1.3. Островки на y=1.2 верх y=1.5. - -- Игрок СТОИТ на островке когда его _pos.y - halfH (= нижняя точка - -- капсулы) ~= верх островка. Стоит на лаве когда нижняя точка ниже 1.3. - local py = __rbxl_player_y() - if py >= 1.35 then return end -- стоит на островке/финише — пропускаем + inLava = true +end) +part.TouchEnded:Connect(function(hit) + local h = hit.Parent and hit.Parent:FindFirstChild("Humanoid") + if not h then return end + inLava = false +end) + +RunService.Heartbeat:Connect(function() + if not inLava then return end + if isOverSafeSpot() then return end -- стоит над островком/финишем __rbxl_damage_player(20) hitSound:Play() end)`,