script:feature:extend_block_breaking_prohibited_allowed_areas
Mục lục
[ 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