Ghi Chú Phát Triển (22): Hệ Thống Túi Đồ - nói dối e blog

Ghi Chú Phát Triển (22): Hệ Thống Túi Đồ

Chúng tôi đã hoàn thành cột mốc đầu tiên của dự án một cách tương đối thuận lợi. Các chức năng cơ bản như đăng ký và đăng nhập người dùng, di chuyển trong cảnh quan, các hành động cơ bản như chạy nhảy, kỹ năng tấn công phép thuật từ xa, hành vi đơn giản của quái vật và NPC đã được triển khai đầy đủ. Chúng tôi đã thử nghiệm tình huống hỗn chiến giữa hàng chục người chơi và hàng trăm NPC, hiệu suất vẫn khá mượt mà.

Sau khi hoàn thành giai đoạn này, chúng tôi dành thời gian nghỉ ngơi ngắn rồi bắt đầu lập kế hoạch cho cột mốc thứ hai. Giai đoạn này dự kiến kéo dài ba tháng, tập trung hoàn thiện hầu hết các chức năng thiết yếu của game MMORPG.

Một trong những nhiệm vụ trọng tâm là xây dựng các mô-đun liên quan đến túi đồ, vật phẩm, trang bị, tiền tệ, rơi đồ và giao dịch.

Dưới đây là ghi chép về tư duy thiết kế hệ thống túi đồ:

Chúng tôi muốn theo dõi từng vật phẩm có khả năng giao dịch, mỗi vật phẩm đều có ID duy nhất 64bit. Trong ô túi đồ cho phép chồng chất nhiều vật phẩm giống nhau, nhưng mỗi vật phẩm vẫn giữ ID riêng. ID này chủ yếu dùng để xác thực chủ sở hữu cuối cùng, không cần truyền về client và không cần truy xuất bên ngoài hệ thống giao dịch.

Chúng tôi xác định ba khái niệm chính: Túi đồ (BAG), Kho lưu trữ (STORAGE) và Vật phẩm (ITEM).

Vật phẩm bao gồm trang bị, nhưng không bao gồm tiền tệ (chỉ theo dõi số lượng mà không cần ID từng đơn vị) và vật phẩm nhiệm vụ. Vật phẩm nhiệm vụ có thể được đặt trong túi đồ, di chuyển vị trí nhưng không thể giao dịch. Chúng không cần ID vì thực chất là chỉ báo tiến độ nhiệm vụ.

Kho lưu trữ chứa toàn bộ vật phẩm của người chơi. Mỗi người chơi chỉ có một kho duy nhất, mỗi ô trong kho chỉ chứa được một vật phẩm đơn lẻ, không cho phép chồng chất. Người chơi chỉ có thể thêm/xóa vật phẩm trong kho, không thể hoán đổi vị trí hay chỉ định ô cụ thể. Về bản chất, kho là công cụ hỗ trợ theo dõi sở hữu vật phẩm.

Túi đồ là nơi chứa toàn bộ vật phẩm, tiền tệ và vật phẩm nhiệm vụ của người chơi. Mỗi người chơi có thể sở hữu nhiều túi đồ, các vị trí trang bị, ngân hàng đều được xây dựng dựa trên cơ chế túi đồ. Ô túi đồ cho phép chồng chất nhiều vật phẩm giống nhau, cũng có thể chứa tiền tệ hoặc vật phẩm nhiệm vụ.

Vật phẩm được lưu trữ dưới dạng đối tượng Lua trong bộ nhớ, mỗi loại vật phẩm có phương thức riêng để truy xuất thuộc tính đặc trưng. Chúng tôi dự định dùng tên loại vật phẩm kết hợp tham số khởi tạo để lưu trữ bền vững đối tượng vật phẩm.

Ví dụ, đa số vật phẩm trong game chỉ cần “loại vật phẩm” và “tên” để xác định duy nhất. “Loại vật phẩm” là tên phân loại, tham số khởi tạo chính là tên. Các thông số như cấp độ, giá giao dịch, mô tả chi tiết sẽ được tra cứu từ bảng dữ liệu do策划填写 dựa trên tên này. Tất nhiên, thay vì dùng “tên”, chúng tôi cũng có thể dùng “ID loại” để tra cứu tên vật phẩm.

Trang bị phức tạp hơn, chỉ có tên chưa đủ để xây dựng. Chúng có thể chứa các thuộc tính ngẫu nhiên. Chúng tôi áp dụng thủ thuật nhỏ: chỉ lưu trữ hạt giống ngẫu nhiên trong tham số khởi tạo, sau đó dùng hạt giống này để tạo ra các giá trị ngẫu nhiên trong quá trình xây dựng đối tượng.

Đối với trang bị đặc biệt như thiết bị do người chơi chế tạo cần lưu tên người chế tạo, hoặc trang bị gắn đá cường hóa cần ghi nhận thông tin cường hóa.

Nguyên tắc chung là: kết hợp loại vật phẩm và tham số gắn với loại đó phải có thể xác định duy nhất vật phẩm. Loại vật phẩm được biểu diễn bằng chuỗi, tương ứng với script xây dựng đối tượng tương ứng.

Đối tượng trang bị phải cung cấp ít nhất một phương thức để tuần tự hóa lại thành loại và tham số khởi tạo. Khi định nghĩa rõ ràng khái niệm trang bị và cách biểu diễn, chúng tôi tách biệt mô-đun trang bị khỏi túi đồ và hệ thống giao dịch.

Hệ thống túi đồ tận dụng hệ thống lưu trữ chia sẻ đã phát triển trước đó. Tuy nhiên, mỗi ô vật phẩm được bổ sung thêm trường chứa đối tượng vật phẩm. Mỗi lần tải, hệ thống sẽ xây dựng đối tượng vật phẩm dựa trên loại và tham số. Trong quá trình vận hành, mọi thao tác đều thông qua đối tượng này.

Mỗi ô túi đồ chỉ chứa một đối tượng vật phẩm, nhưng có thể tham chiếu đến nhiều ô kho để biểu thị chồng chất. Hoán đổi hai ô túi đồ không ảnh hưởng đến kho, chỉ thay đổi chỉ số tham chiếu. Tuy nhiên, nếu đối tượng trong ô túi đồ không tồn tại trong kho (như vật phẩm nhiệm vụ hoặc tiền tệ đặc biệt), việc di chuyển cần tuần tự hóa lại đối tượng tại ô đích.

Chúng tôi không xây dựng riêng quy trình lưu dữ liệu người chơi. Do đó, việc giữ toàn bộ dữ liệu cần lưu trữ trong hệ thống lưu trữ chia sẻ là rất quan trọng. Bất cứ lúc nào, tiến trình khác cũng có thể đọc và lưu trữ bền vững dữ liệu. Vấn đề nhân bản vật phẩm trong tình huống biên sẽ do hệ thống giao dịch đảm bảo.

Hệ thống túi đồ có các thao tác cơ bản sau:

  • TRUY VẤN (QUERY): Kiểm tra đối tượng và số lượng vật phẩm trong ô.
  • XUẤT GIAO DỊCH (TRADEOUT): Lấy toàn bộ vật phẩm trong ô, tạo đơn giao dịch. API này xóa vật phẩm khỏi túi đồ, nếu ô có tham chiếu kho cũng sẽ xóa tham chiếu. Đơn giao dịch trả về chứa dữ liệu tuần tự hóa vật phẩm và toàn bộ ID duy nhất.
  • NHẬP GIAO DỊCH (TRADEIN): Hợp nhất toàn bộ vật phẩm trong đơn giao dịch vào ô. Đây là thao tác ngược với TRADEOUT.
  • HOÁN ĐỔI (EXCHANGE): Đ
0%