Kĩ thuật xử lý lệnh chat mod NRO
Kĩ thuật xử lý lệnh chat mod NRO
Đây là bài viết giới thiệu về một kĩ thuật thường dùng trong mod NRO. Mình sử dụng Visual Studio để mod nên ai muốn dùng cách khác mà code lỗi thì tự tìm cách sửa lỗi nhé.
Các đoạn code chỉnh sửa trong game mình sẽ trình bày dưới dạng sau:
// <Tên class>
<Thư viện khai báo thêm nếu có>
... (Mô tả doạn code nếu có)
<Hàm nhận dạng>
{
...
<Câu lệnh nhận dạng> (nếu không có câu lệnh này và dòng ... phía trên tức là chỉnh sửa ở đầu hàm)
/*Ghi chú thao tác với code (nếu có)*/
// Giải thích code (nếu có)
<Code viết thêm>
...
}
...
Các thẻ <Nội dung mô tả>
sẽ bị thay thể bởi một thứ gì đó theo nội dung mô tả trong thẻ.
Video hướng dẫn: https://youtu.be/yuukM6H-6u8
Xử lý lệnh chat đơn giản
Đây là nhóm các lệnh chat đơn giản, không mang theo thông tin thường để sử dụng Bật/Tắt các tính năng mod hoặc để thực hiện một hành động nào đó.
Ví dụ: lệnh ts (tàn sát), anhat (auto nhặt), xmp (mở menu xmap), ...
Giả sử ta có biến string text
là dữ liệu khi ta chat và "anhat"
là lệnh chat để bật/tắt auto nhặt, cách xử lý lệnh chat này có cấu trúc như sau:
if (text == "anhat")
{
<Code chức năng bật/tắt auto nhặt>
}
Xử lý lệnh chat kèm thông tin
Đây là nhóm các lệnh chat có chứa thêm một hoặc nhiều thông tin (thường là một), chức năng của lệnh chat này sẽ sử dụng thông tin của lệnh chat đó.
Ví dụ: kzX (đổi sang khu X), tdcX (cài đặt tốc độ chạy X), tele X Y (dịch chuyển tới toạ độ X Y), .... X ở đây là thông tin thêm từ lệnh chat (thường là số).
Đối với lệnh chat dạng này ta cần phải kiểm tra và lấy được dữ liệu từ lệnh chat, mình sẽ hỗ trợ vấn đề này còn mod chức năng gì thì ta sẽ bàn ở bài viết khác.
Xử lý lệnh chat có một thông tin
Để cho tiện mình đã viết sẵn hàm kiểm tra và tách dữ liệu, các bạn copy hai hàm này vào cùng class xử lý lệnh chat. Nếu các bạn xem không hiểu cũng không sao, chỉ cần biết cách sử dụng là được.
private static bool IsGetInfoChat<T>(string text, string s)
{
if (!text.StartsWith(s))
{
return false;
}
try
{
Convert.ChangeType(text.Substring(s.Length), typeof(T));
}
catch
{
return false;
}
return true;
}
private static T GetInfoChat<T>(string text, string s)
{
return (T)Convert.ChangeType(text.Substring(s.Length), typeof(T));
}
Giả sử ta có biến string text
là dữ liệu khi ta chat, xử lý lệnh chat có một thông tin có cấu trúc như sau:
// kiểm tra số nguyên sau lệnh chat kz
if (IsGetInfoChat<int>(text, "kz"))
{
// Lấy số nguyên sau lệnh chat kz (khu cần chuyển)
int zone = GetInfoChat<int>(text, "kz");
<Code chức năng đổi khu>
}
// kiểm tra số thực sau lệnh chat spd
else if (IsGetInfoChat<float>(text, "spd"))
{
float s = GetInfoChat<float>(text, "spd");
<Code chức năng sửa tốc độ game>
}
Hai chức năng trên được hướng dẫn tại Tổng hợp mod cơ bản: https://phucprotein.blogspot.com/2021/05/tong-hop-cac-chuc-nang-mod-on-gian.html
Xử lý lệnh chat có nhiều thông tin (các thông tin cách nhau bởi khoảng trắng)
Tương tự như lệnh chat có một thông tin mình cũng viết sẵn cho các bạn hai hàm để kiểm tra và tách dữ liệu. Cái này rất ít khi dùng mình chỉ làm cho đầy đủ thôi nên các bạn có thể bỏ qua.
private static bool IsGetInfoChat<T>(string text, string s, int n)
{
if (!text.StartsWith(s))
{
return false;
}
try
{
string[] vs = text.Substring(s.Length).Split(' ');
for (int i = 0; i < n; i++)
{
Convert.ChangeType(vs[i], typeof(T));
}
}
catch
{
return false;
}
return true;
}
private static T[] GetInfoChat<T>(string text, string s, int n)
{
T[] ts = new T[n];
string[] vs = text.Substring(s.Length).Split(' ');
for (int i = 0; i < n; i++)
{
ts[i] = (T)Convert.ChangeType(vs[i], typeof(T));
}
return ts;
}
Hai hàm trên có thêm int n
để chỉ số lượng thông tin cần lấy của lệnh chat.
Giả sử ta có biến string text
là dữ liệu khi ta chat, xử lý lệnh chat có nhiều thông tin có cấu trúc như sau:
/*Đây chỉ là ví dụ thôi chứ cái tele này admin fix lâu rồi*/
if (IsGetInfoChat<int>(text, "tele", 2))
{
int[] pos = GetInfoChat<int>(text, "tele", 2);
int x = pos[0];
int y = pos[1];
<Code chức năng dịch chuyển đến toạ độ x y>
}
Xử lý các lệnh chat với nhau
Một phiên bản mod hoàn thiện sẽ có nhiều lệnh chat, để tránh các lệnh chat xung đột với nhau thì mình sử dụng hai kĩ thuật ở trên và quản lý lệnh chat theo cách bên dưới các bạn có sử dụng theo. Lưu ý để các lệnh chat không xung đột nhau thì bắt buộc các lệnh chat cùng loại (loại đơn giản và loại kèm thông tin) phải không được trùng nhau.
Với lệnh chat đầu tiên ta sử dụng if
với các lệnh chat còn lại ta sử dụng else if
. Cấu trúc xử lý sẽ có dạng tương tự như sau:
if (text == <Lệnh chat 1>)
{
<Code chức năng tương ứng>
}
else if (text == <Lệnh chat 2>)
{
<Code chức năng tương ứng>
}
else if (IsGetInfoChat<int>(text, <Lệnh chat 3>))
{
int num = GetInfoChat<int>(text, <Lệnh chat 3>);
<Code chức năng tương ứng>
}
... (các lệnh chat tiếp theo)
else if (text == <Lệnh chat n>)
{
<Code chức năng tương ứng>
}
Không chat những lệnh chat
Việc gửi lệnh chat lên server nhiều lần có thể khiến admin nghi ngờ ta sử dụng phiên bản mod hack nào đó (trước giờ cũng chưa nghe ai bị khoá acc vì chat những lệnh chat của phiên bản mod). Hoặc nếu bạn thấy lệnh chat ngứa mắt như mình thì cũng là một lý do để chặn.
Các bạn sử dụng một biến bool
để đánh dấu, nếu mà câu chat không phải là lệnh chat thì sẽ tiếp tục được gửi đi, ngược lại câu chat sẽ bị chặn.
// Service
...
public void chat(string text)
{
bool isSendChat = false;
if (text == <Lệnh chat 1>)
{
<Code chức năng tương ứng>
}
else if (text == <Lệnh chat 2>)
{
<Code chức năng tương ứng>
}
else if (IsGetInfoChat<int>(text, <Lệnh chat 3>))
{
int num = GetInfoChat<int>(text, <Lệnh chat 3>);
<Code chức năng tương ứng>
}
... (các lệnh chat tiếp theo)
else if (text == <Lệnh chat n>)
{
<Code chức năng tương ứng>
}
else // Câu chat không phải các lệnh chat trên
{
isSendChat = true;
}
if (!isSendChat)
{
// Kết thúc hàm, chặn không cho lệnh chat được gửi đi
return;
}
... (phần code gửi lệnh chat của game)
}
...
Xử lý các lệnh chat từ mã nguồn mở
Trong các thư viện mã nguồn mở của mình có sẵn một số lệnh chat các bạn có thể copy vào phần xử lý chat của các bạn hoặc sử dụng hàm xử lý lệnh chat của thư viện.
// Service
<Khai báo thư viện 1>
<Khai báo thư viện 2>
... (Khai báo thư viện tiếp theo)
<Khai báo thư viện n>
...
public void chat(string text)
{
bool isChatLib = <Xử lý chat thư viện 1> || <Xử lý chat thư viện 2> || ... || <Xử lý chat thư viện n>;
if (isChatLib)
{
return;
}
... (Phần xử lý lệnh chat của bạn)
... (phần code gửi lệnh chat của game)
)
...
Ví dụ xử lý lệnh chat của thư viện Xmap:
// Service
using AssemblyCSharp.Mod.Xmap;
...
public void chat(string text)
{
bool isChatLib = Pk9rXmap.Chat(text);
if (isChatLib)
{
return;
}
... (Phần xử lý lệnh chat của bạn)
... (phần code gửi lệnh chat của game)
)
...
Các bạn xem thêm hướng dẫn cài đặt xmap tại: https://youtu.be/enF9qWPoW44
Nhận xét
Đăng nhận xét