======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!**
----