======[ Mở rộng ] Nhóm khu vực cấm & cho phép phá khối====== **Mở rộng:[[script:feature:Block breaking prohibited/allowed areas| Kịch bản - 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:**[[https://www.facebook.com/fb.ngkhanh.mc|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\\ **[[https://www.facebook.com/groups/miniworldvn.developer|Mini World Developer Việt Nam]]** chính thức của chúng tôi