Công cụ thành viên

Công cụ trang web


script:feature:mini_world_api:how_to_get_player_attributes

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:

  1. Bạn có thể xem thêm danh sách thuộc tính tại: Player attribute list
  2. Tìm hiểu về mã lỗi và xử lý lỗi tại: Error codes and error handling
  3. 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.
  4. Ví dụ: print(“Hello”.. “world!”) → in ra Hello world!

script/feature/mini_world_api/how_to_get_player_attributes.txt · Sửa đổi lần cuối: 2025/05/10 15:45 bởi leo