======[ 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