Mục lục
Lấy thuộc tính người chơi bằng script
Thuộc tính người chơi là gì?
Như bạn có thể đoán, Player Attributes (thuộc tính người chơi), hay còn gọi ngắn gọn là playerattr, rất quan trọng vì chúng lưu trữ các giá trị thiết yếu liên quan trực tiếp đến nhân vật trong game. Ví dụ như: máu (HP), khả năng tấn công, tốc độ và phòng thủ.
Bạn có thể nghĩ chúng giống với biến riêng tư (private variables), nhưng thực ra chúng khác nhau. Dù đều liên quan trực tiếp đến người chơi, playerattr đã được định nghĩa sẵn bởi game – bạn không thể tạo mới, chỉ có thể thay đổi giá trị. Trong khi đó, biến riêng tư là do bạn tự tạo và định nghĩa.
Cách sử dụng thuộc tính người chơi
Sau một chút lý thuyết, chắc bạn đang tự hỏi: “Làm sao để sử dụng chúng?”. Câu trả lời là dùng hàm:
Player:getAttr(objid: number, attrtype: number)
Hàm này nhận hai tham số:
objid: ID của người chơi mà bạn muốn lấy thuộc tính.
attrtype: Loại thuộc tính mà bạn muốn lấy.
Hàm trả về:
errorcode (mã lỗi nếu có).
Giá trị thuộc tính (số).
Ví Dụ:
Giả sử bạn muốn khi người chơi tấn công một diễn viên (actor) hoặc người chơi khác, thì hệ thống sẽ lấy thuộc tính của cả người tấn công và người bị tấn công. Ta sẽ viết một hàm nhận các tham số từ sự kiện Player.DamageActor.
function PlayerDamageActor(params) end ScriptSupportEvent:registerEvent([=[Player.DamageActor]=], PlayerDamageActor)
Khai báo biến để lưu thông tin:
function PlayerDamageActor(params) local playerid = params.eventobjid local otheractorid = params.toobjid end
Kiểm tra xem đối tượng bị đánh có phải người chơi không
Dùng hàm Actor:isPlayer(objid) để kiểm tra. Nếu là người chơi → trả về 0, còn không thì trả về 1001.
function PlayerAttackHits(params) local playerid = params.eventobjid local otheractorid = params.toobjid if Actor:isPlayer(otheractorid) == 0 then -- Là người chơi else -- Là sinh vật end end ScriptSupportEvent:registerEvent([=[Player.DamageActor]=], PlayerAttackHits)
Nếu bạn không thích dùng hàm trong điều kiện if thì có thể gán vào biến trước:
local result = Actor:isPlayer(otheractorid) if result == 0 then -- Là người chơi end
Lấy thuộc tính và hiển thị trong tin nhắn
Dùng hàm Player:getAttr() để lấy máu, sau đó dùng Chat:sendSystemMsg() để hiển thị.
function PlayerDamageActor(params) local playerid = params.eventobjid local otheractorid = params.toobjid if Actor:isPlayer(otheractorid) == 0 then local result, AttributeValue = Player:getAttr(otheractorid, PLAYERATTR.CUR_HP) Chat:sendSystemMsg("Máu của kẻ địch là: ".. AttributeValue, playerid) else local result, OtherAttributeValue = Creature:getAttr(otheractorid, CREATUREATTR.CUR_HP) Chat:sendSystemMsg("Máu của quái là: ".. OtherAttributeValue, playerid) end end ScriptSupportEvent:registerEvent([=[Player.DamageActor]=], PlayerDamageActor)
Thay đổi thuộc tính người chơi
Để thay đổi thuộc tính, dùng hàm:
Player:setAttr(objid, attrtype, NewVal)
Ví dụ, đặt máu của mục tiêu về 0 mỗi khi bị đánh:
local function PlayerDamageActor(params) local playerid = params.eventobjid local otheractorid = params.toobjid if Actor:isPlayer(otheractorid) == 0 then local result = Player:setAttr(otheractorid, PLAYERATTR.CUR_HP, 0) else local result = Creature:setAttr(otheractorid, CREATUREATTR.CUR_HP, 0) end end ScriptSupportEvent:registerEvent([=[Player.DamageActor]=], PlayerDamageActor)
Giờ thì, mỗi khi người chơi gây sát thương, mục tiêu (người chơi khác hoặc sinh vật) sẽ bị đưa máu về 0 ngay lập tức.
Chú thích:
- Bạn có thể xem thêm danh sách thuộc tính tại: Player attribute list
- Tìm hiểu về mã lỗi và xử lý lỗi tại: Error codes and error handling
- Biến local chỉ có phạm vi trong block hoặc hàm. Điều này giúp giữ code gọn gàng và tránh xung đột.
- Ví dụ: print(“Hello”.. “world!”) → in ra Hello world!