Xây dựng, phá huỷ, thành tựu
Ba hệ thống có sẵn trong KHIM, mỗi cái bật bằng vài dòng trong Script trên server.
Người chơi xây dựng
Cho người chơi xây bằng khối - sandbox, xây căn cứ, game làm cầu - không cần lập trình tool, không cần tin nhắn, không cần tự kiểm tra. Engine lo cả ba.
-- Một Script trong ServerService
building.enabled = true -- người chơi có nút Build và phím B
building.limit = 200 -- số khối một người được đặt cùng lúc (ban đầu 100; tối đa 2.000)
building.reach = 32 -- số unit tính từ nhân vật (tối đa 200)
building.blockSize = 2 -- cạnh khối tính bằng unit, cũng là lưới khối bám vào (0,5 tới 16)
building.loose = false -- true: khối không neo, tháp có thể đổ
building.keepOnLeave = false -- true: khối của người chơi ở lại sau khi họ rời
building.removeAny = false -- true: ai cũng phá được khối của người khácKhi chơi: B (hoặc nút khối trên dock) bật chế độ xây. Một khung viền theo con trỏ - xanh ở chỗ đặt được, đỏ ở chỗ không, kèm lý do. Bấm để đặt. Thanh xây chọn hình (Q), màu (C), vật liệu (V), đặt hay phá (X); R xoay khối.
Server kiểm tra mọi thứ: trong tầm, không vướng gì, không nằm trong người chơi, chưa quá giới hạn, tựa vào vật rắn. App bị sửa cũng không xây giữa không trung hay xuyên bản đồ được.
Luật riêng của bạn:
building.placed:connect(function(player, block)
if block.position.y > 100 then building.remove(block) end -- không xây tháp lên trời
end)
building.removed:connect(function(player, block) -- player là nil khi game xoá nó
end)
print(building.count(player)) -- họ đang có bao nhiêu khối
local mine = building.blocks(player) -- các khối của họ (không truyền người chơi: mọi khối)
building.remove(block, true) -- xoá một khối, cho nó vỡ vụnKhối là part bình thường tên Block, có tag Built và attribute BuilderId (số tài khoản người xây) - nên tags.each("Built", ...), touched và phá huỷ đều dùng được. Muốn lưu công trình, lưu vị trí, màu và hình của từng khối vào một data store.
Mẫu Sandbox ở Home của KHIM Engine là một world đã bật xây dựng.
Phá huỷ
destruction phá vỡ đồ vật, và giữ cho mảnh vỡ trong tầm kiểm soát (Script trên server).
-- Bức tường trúng tên lửa vỡ thành mảnh văng ra khỏi điểm trúng
local pieces = destruction.shatter(world.Wall, {force = 60, radius = 12, center = hitPosition})
-- Một vụ nổ: khớp và hàn đứt, part thả bay đi, người chơi mất máu, part trong tầm vỡ vụn
destruction.explode(barrel.position, {force = 80, radius = 15, damage = 40, fracture = true})
destruction.detach(world.Bridge) -- hàn và khớp của nó đứt: nó rơi
destruction.repair(world.Wall) -- trở lại như cũ (đặt lại sau một vòng chơi)
destruction.clear() -- xoá mọi mảnh vỡ ngay
print(destruction.debrisCount())| Hàm | Tuỳ chọn |
|---|---|
shatter(part, options) | force (40), radius, center, pieces. Trả về các mảnh |
explode(position or part, options) | force (60), radius (12), damage (0), fracture (false), breakAnchored (false). Trả về số part bị ảnh hưởng |
detach(part) | Làm đứt hàn và khớp của nó |
repair(part) | Đặt lại một part đã vỡ |
Giữ trong tầm kiểm soát - destruction.configure{...}:
| Cài đặt | Mặc định | |
|---|---|---|
maxDebris | 200 | Số mảnh tồn tại cùng lúc; quá thì mảnh cũ nhất biến mất |
lifetime | 12 | Số giây một mảnh tồn tại |
maxPieces | 16 | Số mảnh từ một lần vỡ |
piecesPerStep | 96 | Số mảnh mọi lần vỡ được tạo trong một bước |
simulationDistance | 300 | Mảnh xa hơn mức này với mọi người chơi thì ngủ yên |
Thành tựu
Trao cho người chơi một thành tựu của game; hồ sơ KHIM của họ hiện nó, kèm tên game của bạn.
world.Coin.touched:connect(function(hit)
local player = players.fromPart(hit)
if player then
achievements.award(player, "first-coin", "Đồng xu đầu tiên", "Nhặt một đồng xu.")
end
end)- Key (
"first-coin") gồm 1-40 chữ cái, chữ số,_hoặc-. Lần trao đầu tiên của một key đặt tên và mô tả cho nó. - Trả
truekhi lần gọi này vừa trao,falsekhi người chơi đã có từ server này, hoặc là khách. Gọi mỗi khung hình cũng không tốn gì. - Tối đa 100 thành tựu mỗi game. Chỉ Script trên server.
Hẹn giờ, máy tạo và part di chuyển
Vòng chơi, đợt quái và máy thả thường không cần script: xem Timer, Spawner và Motion trong Chạm, Prompt và Zone.
Vòng lặp vòng chơi
Một khung thường gặp cho game chơi theo vòng:
-- Script (ServerService)
local ROUND, INTERMISSION = 120, 15
while true do
chat.send("Vòng tiếp theo sau " .. INTERMISSION .. " giây")
task.wait(INTERMISSION)
for _, player in players.all() do
player:teleport(world.Arena.position + vec3(0, 5, 0))
end
world.Scoreboard:setAttribute("TimeLeft", ROUND)
for left = ROUND, 1, -1 do
world.Scoreboard:setAttribute("TimeLeft", left)
task.wait(1)
end
chat.send("Hết vòng!")
destruction.clear()
for _, player in players.all() do
player:teleport(world.Lobby.position + vec3(0, 5, 0))
end
end