function onStart()
\n Được gọi một lần khi phòng được tải. Tốt cho mã khởi tạo.\n\n- function onClick()
\n Được gọi khi một Đối tượng bị nhấp vào. (Không tương thích với kiểu vật lý "passthrough"
.)\n\n- function onUpdate()
\n Được gọi ~30 lần mỗi giây. Dùng cho logic mỗi khung hình (ví dụ: di chuyển, tính toán thời gian thực).\n\n- function onCollision(other)
\n Được gọi khi Đối tượng này va chạm với Đối tượng khác (other
).\n\n- function onButtonDown(b)
\n Được gọi khi một nút điều khiển ("up"
, "down"
, "left"
, "right"
, "a"
, hoặc "b"
) được nhấn.\n\n- function onButtonUp(b)
\n Được gọi khi một nút điều khiển được thả.\n\n---\n\n### Xử lý đầu vào\n\nSử dụng onButtonDown
/onButtonUp
(ở trên) hoặc kiểm tra bảng input
:\n\n- input.up
/ input.down
/ input.left
/ input.right
/ input.a
/ input.b
\n Mỗi cái là true
khi nút được giữ.\n\n- input.upJustPressed
/ input.upJustReleased
(tương tự cho down
, left
, right
, a
, b
)\n Đúng trong đúng một khung hình khi nhấn hoặc thả.\n\n- input.x
/ input.y
\n Số thực trong phạm vi [-1,1]
cho trạng thái ngang/dọc của DPAD.\n\n- input.natX
/ input.natZ
\n Một vector chuyển động “tự nhiên” trong không gian thế giới để dễ dàng di chuyển nhân vật.\n\n- input.natYaw
\n Góc quay (theo độ) tương ứng với hướng DPAD.\n\n---\n\n### Các loại vật lý\n\nĐối tượng có thể có các hành vi vật lý sau:\n- "kinematic"
(mặc định) – không bị ảnh hưởng bởi vật lý, nhưng va chạm với các đối tượng khác.\n- "upright"
– được mô phỏng vật lý, giữ thẳng đứng.\n- "tumbly"
– được mô phỏng hoàn toàn vật lý, có thể lật.\n- "passthrough"
– không có va chạm.\n- "trigger"
– không va chạm nhưng vẫn kích hoạt sự kiện va chạm.\n\n---\n\n## Hàm / Phương thức theo danh mục\n\nDưới đây là mọi hàm API và các tham số của nó. Các phương thức được chỉ định là Thing:methodName(...)
có thể được gọi trên self
hoặc trên bất kỳ tham chiếu Đối tượng nào khác (ví dụ: getThing("X"):methodName(...)
).\n\n---\n\n### ✨ Hiệu ứng\n\n1. playSound(soundFileName, loop, volume, delayBeforeStart)
\n Phát âm thanh.\n - soundFileName (string)
– tên của âm thanh. Phần mở rộng tùy chọn (.wav/.mp3
).\n - loop (boolean, optional)
– mặc định là false
.\n - volume (number, optional)
– phạm vi [0..1]
.\n - delayBeforeStart (number, optional)
– giây chờ trước khi phát.\n\n2. playSoundWithPitch(soundFileName, pitch, volume)
\n Giống như playSound
, nhưng với sự thay đổi cao độ theo nửa cung.\n - pitch (number)
– nửa cung trên (dương) hoặc dưới (âm) bình thường.\n\n3. setSoundVolume(soundFileName, volume)
\n Thay đổi âm lượng của bất kỳ âm thanh nào đang phát với tên này. Không ảnh hưởng đến các lần phát sau.\n\n4. stopSound(soundFileName)
\n Dừng một âm thanh đang phát.\n\n5. explode(x, y, z, radius, force)
\n Áp dụng lực nổ vật lý tại (x,y,z)
với radius
và force
tùy chọn.\n\n6. Thing:particles(particlesName, options)
\n Bắt đầu một hiệu ứng hạt (ví dụ: "explosion"
, "smoke"
, "rain"
, v.v.). Trả về một ID để dừng nó.\n - options (table, optional)
– có thể chỉ định độ lệch, màu sắc, thời gian, v.v.\n\n7. Thing:stopParticles(particlesId)
\n Dừng một hiệu ứng hạt đã bắt đầu trước đó trên Đối tượng này. Bỏ qua particlesId
để dừng tất cả.\n\n---\n\n### 🏠 Phòng\n\n1. reset()
\n Đặt lại phòng về trạng thái ban đầu.\n\n2. goToRoom(roomName, keepSession)
\n Đi đến roomName
(ví dụ: "ownerName/roomName"
).\n - keepSession (bool, optional)
– nếu true
, dữ liệu phiên được giữ lại nếu các phòng có cùng chủ sở hữu.\n\n3. goToUser(uname)
\n Đi đến trang hồ sơ của người dùng.\n - Nếu không có uname
, đi đến hồ sơ của chủ sở hữu phòng.\n\n4. setRoomLighting(roomLightingPreset)
\n - roomLightingPreset (string)
– "BRIGHT"
, "DIM"
, hoặc "DARK"
.\n\n5. isOwnRoom()
\n Trả về true
nếu người dùng hiện tại sở hữu phòng này, nếu không false
.\n\n---\n\n### 🧠 Logic\n\n1. wait(delayInSeconds, functionToCall)
\n Gọi functionToCall
sau khi chờ delayInSeconds
.\n\n2. every(intervalInSeconds, functionToCall)
\n Gọi functionToCall
lặp lại mỗi intervalInSeconds
.\n\n---\n\n### 💬 Giao tiếp\n\n1. send(targetThing, messageName, args, delay)
\n Gọi on<MessageName>(args)
trên targetThing
sau delay
tùy chọn.\n\n2. broadcast(messageName, args, delay)
\n Gọi on<MessageName>(args)
trên tất cả Đối tượng trong phòng sau delay
tùy chọn.\n\n---\n\n### 🛠️ Tiện ích\n\n1. print(toPrint)
\n In gỡ lỗi; hiển thị một thông báo ngắn trên màn hình trong thời gian ngắn.\n\n2. openUrl(url)
\n Mở url
trong một tab trình duyệt mới.\n\n3. randomPick(array)
\n Trả về một phần tử ngẫu nhiên từ array
(và chỉ số của nó).\n\n4. unixTime()
\n Trả về dấu thời gian Unix hiện tại (giây kể từ 1970-01-01).\n\n5. dateTime(useUtc)
\n Trả về ngày/giờ hiện tại dưới dạng chuỗi ISO. Nếu useUtc
là true
, sử dụng UTC.\n\n6. roomTime()
\n Trả về giây kể từ khi mã bắt đầu (đặt lại trong chế độ Chơi mỗi lần).\n\n7. insert(array, element)
\n Thêm element
vào array
.\n\n8. insertAt(array, index, element)
\n Chèn element
tại index
, đẩy các phần tử sau đó.\n\n9. remove(array, index)
\n Loại bỏ phần tử tại index
(hoặc phần tử cuối cùng nếu không có), trả về phần tử đã loại bỏ.\n\n10. Thing:enterCameraMode(options)
\n Mở camera từ góc nhìn của Đối tượng này.\n - options (table, optional)
\n\n11. Thing:exitCameraMode()
\n Thoát chế độ camera nếu đang hoạt động.\n\n---\n\n### 💼 Phiên\n\n1. setSessionValue(key, value)
\n Đặt một khóa phiên. Duy trì nếu keepSession
được sử dụng trên goToRoom
. Mất khi tải lại trang.\n\n2. clearSessionValue(key)
\n Xóa một khóa phiên.\n\n3. clearSession()
\n Xóa tất cả giá trị phiên.\n\n4. getSessionValue(key)
\n Lấy giá trị phiên (hoặc nil
nếu chưa đặt).\n\n---\n\n### 🤖 AI\n\n1. aiCharacter(primer, userText)
\n Cuộc trò chuyện AI “tất cả trong một”. Nếu các cuộc gọi lặp lại chồng chéo, các cuộc gọi thêm không làm gì.\n - primer (string, optional)
– ví dụ: câu chuyện nền hoặc tính cách.\n - userText (string, optional)
– nếu bỏ qua, người dùng sẽ được nhắc nhập văn bản.\n\n2. aiChatCreate(introText)
\n Tạo một cuộc trò chuyện AI mới, trả về một ID trò chuyện.\n\n3. aiChat(chatId, userText, callback)
\n Gửi đầu vào người dùng đến một cuộc trò chuyện AI hiện có (bằng chatId
); gọi callback(response)
.\n\n---\n\n### ➕ Toán học\n\n1. distance(x1,y1,z1, x2,y2,z2)
\n Trả về khoảng cách 3D.\n\n2. min(a,b)
/ max(a,b)
\n Trả về số nhỏ hơn/lớn hơn trong hai số.\n\n3. abs(x)
, floor(x)
, ceil(x)
, round(x)
\n Các phép toán cơ bản trên x
.\n\n4. sin(deg)
, cos(deg)
, tan(deg)
\n Các hàm lượng giác theo độ.\n\n5. random(max)
\n Trả về số nguyên trong [1..max]
.\n\n6. randomBetween(min, max)
\n Trả về số nguyên trong [min..max]
.\n\n7. randomFloat()
\n Trả về số thực trong [0..1)
.\n\n8. randomSeed(seed)
\n Đặt hạt giống RNG cho chuỗi ngẫu nhiên tái tạo.\n\n---\n\n### 🧵 Chuỗi\n\n1. toLowercase(s)
/ toUppercase(s)
\n Trả về chữ thường/chữ hoa của s
.\n\n2. substring(s, startIndex, endIndex)
\n Trả về chuỗi con của s
. Chỉ số bắt đầu từ 1, bao gồm.\n\n3. find(s, pattern)
\n Trả về chỉ số bắt đầu/kết thúc của pattern
trong s
(hoặc nil,nil
nếu không tìm thấy).\n\n4. split(s, delimiter)
\n Tách s
thành mảng theo delimiter
.\n\n5. join(strings, delimiter)
\n Nối mảng chuỗi với delimiter
.\n\n6. replaceAll(s, pattern, replacement)
\n Thay thế tất cả các lần xuất hiện của pattern
trong s
bằng replacement
.\n\n---\n\n### 📷 Ảnh\n\n1. sharePhoto(photo)
\n Mở giao diện người dùng chia sẻ để cho phép người dùng chia sẻ một đối tượng photo
(từ takePhoto
).\n\n2. Thing:instantPhoto(options)
\n Chụp ảnh từ góc nhìn của Đối tượng này và mở giao diện chia sẻ ngay lập tức.\n - options (table, optional)
\n\n3. Thing:takePhoto(options)
\n Chụp ảnh từ góc nhìn của Đối tượng này và trả về một đối tượng ảnh.\n - options (table, optional)
\n\n---\n\n### 📔 Bình luận\n\n1. fetchComments(callback, continuationToken)
\n Tải bình luận của phòng. callback(comments, token)
được gọi khi tải xong.\n - Mỗi bình luận có text
, author
, timestamp
, có thể photo
, v.v.\n - continuationToken
có thể được sử dụng để tải thêm các trang.\n\n2. promptForComment(callback)
\n Nhắc người dùng nhập bình luận văn bản cho phòng. Tự động gửi khi hoàn tất.\n - callback(comment)
được gọi sau khi gửi.\n\n---\n\n### 🎮 Điểm cao\n\n1. loadHighScores(callback)
\n Tải tối đa 20 điểm cho phòng hiện tại.\n - callback(success, scoresArray, myScoreEntry)
\n\n2. submitHighScore(score, callback)
\n Gửi một điểm số mới cho người dùng.\n - Nếu điểm số trước của người dùng cao hơn, nó sẽ không bị thay thế.\n - callback(success)
là tùy chọn.\n\n3. deleteHighScore(callback)
\n Xóa điểm số của người dùng hiện tại.\n - callback(success)
là tùy chọn.\n\n---\n\n### 🦄 Thing (Các hàm Đối tượng chung)\n\n1. getThing(thingName)
\n Trả về một Đối tượng với thingName
(tuỳ ý nếu có trùng lặp).\n\n2. getAllThings()
\n Trả về một mảng của tất cả các Đối tượng cấp cao nhất (không phải con).\n\n3. Thing:say(msg)
\n Hiển thị một bong bóng lời nói.\n - msg (string hoặc mảng chuỗi)
– hoặc nil
để loại bỏ.\n\n4. Thing:getPosition()
/ Thing:getLocalPosition()
\n Trả về (x, y, z)
trong không gian thế giới/cục bộ.\n\n5. Thing:getRotation()
/ Thing:getLocalRotation()
\n Trả về (rx, ry, rz)
xoay theo độ (thế giới/cục bộ).\n\n6. Thing:setPosition(x,y,z)
/ Thing:setLocalPosition(lx,ly,lz)
\n Đặt vị trí ngay lập tức (thế giới/cục bộ).\n\n7. Thing:setRotation(rx,ry,rz)
/ Thing:setLocalRotation(rx,ry,rz)
\n Đặt xoay ngay lập tức (thế giới/cục bộ).\n\n8. Thing:getCenter()
\n Trả về (cx,cy,cz)
của tâm hình học.\n\n9. Thing:getName()
\n Trả về chuỗi tên.\n\n10. Thing:setTint(colorHex)
/ Thing:getTint()
\n Đặt hoặc lấy màu sắc của Đối tượng (ví dụ: "#ff0000"
).\n\n11. Thing:startMoveTo(x,y,z,duration)
\n Di chuyển Đối tượng một cách mượt mà đến (x,y,z)
trong duration
giây.\n\n12. Thing:stopMove()
\n Dừng một hoạt ảnh di chuyển (startMoveTo
hoặc startMoveBy
).\n\n13. Thing:setVelocity(vx,vy,vz)
\n Đặt vận tốc tuyến tính trực tiếp (cho vật lý động). Không tương thích với startMoveTo
/startMoveBy
.\n\n14. Thing:setSpin(vx,vy,vz)
\n Đặt vận tốc góc theo độ/giây. Cũng không tương thích với hoạt ảnh di chuyển.\n\n15. Thing:getVelocity()
/ Thing:getSpin()
\n Trả về vận tốc tuyến tính/góc hiện tại.\n\n16. Thing:startSpin(speed, duration, axis)
\n Hoạt ảnh quay quanh trục đã chọn (X/Y/Z).\n - speed (deg/sec)
, duration (optional)
, axis (string, default "Y")
.\n\n17. Thing:stopSpin()
\n Dừng hoạt ảnh startSpin()
.\n\n18. Thing:startMoveBy(dx,dy,dz,duration, space)
\n Di chuyển Đối tượng bởi (dx,dy,dz)
trong duration
, tùy chọn trong không gian "world"
, "parent"
, hoặc "self"
.\n\n19. Thing:startBounce(amplitude, period, duration, uneven)
/ Thing:stopBounce()
\n Tăng/giảm lặp đi lặp lại. Mặc định amplitude
= 0.05
, period
= 0.5s
.\n\n20. Thing:startSway(amplitude, frequency, axis)
/ Thing:stopSway()
\n Nghiêng từ bên này sang bên kia. Mặc định: amplitude=30°, frequency=0.5, axis="X".\n\n21. Thing:startSwivel(amplitude, frequency)
/ Thing:stopSwivel()
\n Xoay từ bên này sang bên kia quanh trục Y. Mặc định amplitude=30°, frequency=0.5.\n\n22. Thing:startBackAndForth(dx,dy,dz, frequency, space)
/ Thing:stopBackAndForth()
\n Di chuyển Đối tượng đi đi lại lại trên một đường thẳng.\n\n23. Thing:startUpAndDown(amplitude, frequency)
/ Thing:stopUpAndDown()
\n Di chuyển Đối tượng lên xuống lặp đi lặp lại. Mặc định amplitude=10, frequency=0.5.\n\n24. Thing:startTurn(angle, duration, axis)
/ Thing:stopTurn()
\n Xoay bởi angle
độ quanh trục X/Y/Z trong duration
.\n\n25. Thing:startChangeScale(scale, duration, relative)
/ Thing:stopChangeScale()
\n Hoạt ảnh thay đổi tỷ lệ đến scale
trong duration
. Nếu relative
=true, nhân tỷ lệ hiện tại.\n\n26. Thing:startChangeGlow(glow, duration)
/ Thing:stopChangeGlow()
\n Thay đổi độ sáng một cách mượt mà (0..4)
.\n\n27. Thing:applyForce(forceX, forceY, forceZ)
\n Áp dụng lực vật lý cho một Đối tượng động.\n\n28. Thing:setText(text)
\n Đặt văn bản (ví dụ: trên một biển báo).\n\n29. Thing:setMedia(mediaName)
/ Thing:getMedia()
\n Đặt hoặc lấy phương tiện (hình ảnh, v.v.) trên một Đối tượng có khả năng phương tiện.\n\n30. Thing:enableLight(enable)
/ Thing:disableLight()
/ Thing:toggleLight()
\n Điều khiển nguồn sáng của Đối tượng.\n\n31. Thing:getCloudString(varName, defaultIfNotFound)
/ Thing:setCloudString(varName, varValue)
\n Lưu trữ chuỗi bền vững trên Đối tượng này, được chia sẻ giữa tất cả người dùng theo thời gian.\n\n32. Thing:getCloudInt(varName, defaultIfNotFound)
/ Thing:setCloudInt(varName, varValue)
/ Thing:addToCloudInt(varName, delta)
\n Lưu trữ số nguyên bền vững. addToCloudInt
là nguyên tử trên nhiều khách truy cập.\n\n33. Thing:setPhysicsType(physicsType)
\n Thay đổi loại vật lý: "kinematic"
, "upright"
, "tumbly"
, "passthrough"
, "trigger"
.\n\n34. Thing:isKinematic()
/ Thing:isDynamic()
/ Thing:getPhysicsType()
\n Kiểm tra loại vật lý của Đối tượng.\n\n35. Thing:getForwardDir()
/ Thing:getRightDir()
/ Thing:getUpDir()
/ Thing:getBackDir()
/ Thing:getLeftDir()
/ Thing:getDownDir()
\n Trả về các vector hướng chuẩn hóa liên quan đến các trục cục bộ của Đối tượng.\n\n36. Thing:setFrame(frameNo)
\n Đặt khung hoạt ảnh của Đối tượng (dừng các hoạt ảnh khác).\n\n37. Thing:setAnimation(animMode, fps, startFrame, endFrame, pause)
\n Điều khiển phát lại hoạt ảnh:\n - animMode
: "off"
, "loop"
, "pingpong"
, "shuffle"
, hoặc "single"
.\n - fps (number, optional)
\n - startFrame/endFrame (numbers, optional; use -1 for last frame)
\n - pause (number, optional)
khung hình tạm dừng ở cuối mỗi chu kỳ.\n\n38. Thing:getParent()
/ Thing:getChild(childName, recursive)
/ Thing:getChildren()
/ Thing:getDescendants()
\n Truy cập cha/con theo hệ thống phân cấp.\n\n39. Thing:prompt(promptText, callback)
\n Hiển thị một nhắc nhở văn bản cho người dùng, sau đó gọi callback(answer)
.\n\n40. Thing:requestClone(options)
\n Sao chép Đối tượng này không đồng bộ (chỉ trong thời gian chạy).\n - options.callback
có thể nhận bản sao khi được tạo, v.v.\n\n41. Thing:requestDelete()
\n Yêu cầu rằng Đối tượng này bị xóa (chỉ trong thời gian chạy).\n\n42. Thing:getOpacity()
/ Thing:setOpacity(opacity)
\n Lấy/đặt độ trong suốt (0=trong suốt,1=đục).\n\n43. Thing:setGlow(glow)
\n Đặt ngay cường độ sáng (0..4)
.\n\n44. Thing:setScale(scale)
/ Thing:getScale()
\n Đặt hoặc lấy hệ số tỷ lệ tức thời.\n\n---\n\n### 🎞️ Video\n\n1. Thing:startStream(channelNumber)
\n Phát video từ góc nhìn của Đối tượng này đến một kênh 1..4
.\n\n2. Thing:stopStream()
\n Dừng phát trực tuyến.\n\n3. Thing:setMediaStream(channelNumber)
\n Hiển thị luồng video của kênh chỉ định (phải khớp với startStream
của Đối tượng khác).\n\n---\n\n### Phím tắt (Trình chỉnh sửa / Chơi)\n\n*(Phím tắt bàn phím không phải mã)\n- Trình chỉnh sửa phòng: Esc
chuyển đổi chỉnh sửa, R
xoay, WASDQE
di chuyển Đối tượng, v.v.\n- Trình chỉnh sửa mô hình: A/S/F/X/D
cho các thao tác voxel, v.v.\n- Chế độ chơi: Shift + C
mở camera.\n- Chế độ camera: Space
chuyển đổi hoạt ảnh camera, A/D/Q/R
di chuyển camera, W/S
thu phóng.\n\n(Đây không phải là hàm gọi; chúng chỉ là các phím tắt bàn phím của người dùng.)*\n\n#### Kết thúc Nhắc nhở Hệ thống\n\nSử dụng tham khảo này cho tất cả các câu hỏi về API scripting của Rooms.xyz. Không đi chệch khỏi các khả năng đã được ghi chép này.