Công cụ thành viên

Công cụ trang web


script:feature:extend_block_breaking_prohibited_allowed_areas

[ Mở rộng ] Nhóm khu vực cấm & cho phép phá khối

Khái quát cơ chế [ Mở rộng ]

  • Nhóm khu vực cấm phá khối

Người chơi chỉ có thể phá khối ngoài các khu vực được nhập trong bảng TabAreaid. Nếu người chơi phá khối ở trong các khu vực, hành động đào sẽ bị vô hiệu hoá.

  • Nhóm khu vực cho phép phá khối

Người chơi chỉ có thể phá khối trong các khu vực được nhập trong bảng TabAreaid. Nếu người chơi phá khối ở ngoài các khu vực, hành động đào sẽ bị vô hiệu hoá.


Giải thích các dòng lệnh được mở rộng

  • Định nghĩa danh sách khu vực (TabAreaid). Ví dụ:
local TabAreaid = {
    {{x=35, y=6, z=18}, {x=39, y=12, z=27}},
    {{x=40, y=6, z=18}, {x=44, y=12, z=27}}
}
  • Mô tả: TabAreaidlà bảng (mảng) chứa danh sách các khu vực được xác định bởi cặp toạ độ góc đối diện.
  • Khu vực 1: Từ {x=35, y=6, z=18} đến {x=39, y=12, z=27}.
  • Khu vực 2: Từ {x=40, y=6, z=18} đến {x=44, y=12, z=27}.
  • Khu vực n: Từ {x= num, y= num, z= num} đến {x= num, y= num, z= num}.

  • Tạo ID khu vực cho mỗi vùng
for id, pos in pairs(TabAreaid) do
    TabAreaid[id] = select(2, Area:createAreaRectByRange(pos[1], pos[2]))
end
  • Mô tả:
  • Vòng lặp duyệt qua từng mục trong TabAreaid.
  • Với mỗi mục, gọi Area:createAreaRectByRange để tạo khu vực và thay thế cặp toạ độ bằng areaid (ID của khu vực).
  • Kết quả: TabAreaid trở thành danh sách các areaid.

  • Hàm kiểm tra khối nằm trong bất kỳ khu vực nào
local function scanArea(x, y, z)
    for _, areaid in pairs(TabAreaid) do
        if Area:posInArea({x=x, y=y, z=z}, areaid) == 0 then
            return true
        end
    end
    return false
end
  • Mô tả:
  • Hàm scanArea nhận toạ độ của một khối (x, y, z).
  • Duyệt qua từng areaid trong TabAreaid và kiểm tra xem khối có nằm trong khu vực tương ứng hay không bằng Area:posInArea.
  • Kết quả:
  • true: Khối nằm trong một khu vực nào đó.
  • false: Khối không nằm trong bất kỳ khu vực nào.

  • Xử lý sự kiện đào
if scanArea(e.x, e.y, e.z) then

Mô tả: Kiểm tra toạ độ khối (e.x, e.y, e.z) bằng cách gọi scanArea.


  • Kịch Bản Tham Khảo:

Chú ý: Kịch bản cần bổ sung các giá trị tọa độ cần thiết vào bảng TabAreaid để hoạt động


Khu vực cấm phá khối

local TabAreaid = {
    {{x= , y= , z= },{x= , y= , z= }},
    {{x= , y= , z= },{x= , y= , z= }},
...
}
for id,pos in pairs(TabAreaid) do
    TabAreaid[id] = select(2,Area:createAreaRectByRange(pos[1],pos[2]))
end
local function scanArea(x,y,z)
    for _,areaid in pairs(TabAreaid) do
        if Area:posInArea({x=x, y=y, z=z}, areaid) == 0 then
            return true
        end
    end
    return false
end
local function digb(e)
    if scanArea(e.x, e.y, e.z) then
        -- Xác định được vị trí khối đã đào nằm trong nhóm khu vực
        Player:setActionAttrState(e.eventobjid, 8, false)
    else
        Player:setActionAttrState(e.eventobjid, 8, true)
    end
end
ScriptSupportEvent:registerEvent('Block.Dig.Begin', digb)

Khu vực cho phép phá khối

local TabAreaid = {
    {{x=35, y=6, z=18},{x=39, y=12, z=27}},
    {{x=40, y=6, z=18},{x=44, y=12, z=27}}
}
for id,pos in pairs(TabAreaid) do
    TabAreaid[id] = select(2,Area:createAreaRectByRange(pos[1],pos[2]))
end
local function scanArea(x,y,z)
    for _,areaid in pairs(TabAreaid) do
        if Area:posInArea({x=x, y=y, z=z}, areaid) == 0 then
            return true
        end
    end
    return false
end
local function digb(e)
    if scanArea(e.x, e.y, e.z) then
        -- Xác định được vị trí khối đã đào nằm trong nhóm khu vực
        Player:setActionAttrState(e.eventobjid, 8, true)
    else
        Player:setActionAttrState(e.eventobjid, 8, false)
    end
end
ScriptSupportEvent:registerEvent('Block.Dig.Begin', digb)

Cre:Nguyễn Khánh 2025/02/28 09:59


Nếu bạn có bất kỳ câu hỏi nào về Chế Độ DEV Nâng Cao, vui lòng tham gia
Mini World Developer Việt Nam chính thức của chúng tôi

script/feature/extend_block_breaking_prohibited_allowed_areas.txt · Sửa đổi lần cuối: 2025/02/28 10:07 bởi leo