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