thienthanden2
05-02-13, 07:57 PM
Xin chào mọi người!
Có lẽ việc mò ra trap đôi khi làm chúng ta đau đầu, vì có nhiều trap quá khó để tìm ra. Thôi thì chúng ta không cần nhọc công nữa mà code luôn từ source cho nhanh. Hôm nay mình xin hướng dẫn cách tạo 1 trap mới ở bất kỳ nơi đâu.
Mình xin lấy ví dụ trap từ Cái Bang qua Dương Châu. Đây là cách kiểm tra tọa độ trong game bằng script lua :
function kiemtratoado()
w,x,y = GetWorldPos();
Msg2Player("Ban dang o Map "..w.." Toa do "..x..", "..y)
end;
Bây giờ bắt đầu thay đổi source:
1. File \JX\swrod3\SwordOnline\Sources\Core\Src\KNpc.h
Tìm và khai báo thêm 1 hàm mới
.....................................
int m_NpcSettingIdx; // Npc的设定文件索引
int m_CorpseSettingIdx; // Npc的尸体定义索引
char ActionScript[80]; // Npc的行为脚本
char ScriptFile[100]; //dòng thêm để chứa đường dẫn file script .lua tạm thời
DWORD m_ActionScriptID; // Npc的行为脚本ID(使用时用这个来检索 )
DWORD m_TrapScriptID; // Npc的当前Trap脚本ID;
..............................................
void OnWalk();
void DoRun();
void OnRun();
void OnTrap(); // dòng thêm
void DoSkill(int nX, int nY);
int DoOrdinSkill(KSkill * pSkill, int nX, int nY);
void OnSkill();
............................................
2. File \JX\swrod3\SwordOnline\Sources\Core\Src\KNpc.cpp
Tìm hàm void KNpc::Init() và thêm
.........................
ZeroMemory(Name, 32); // Npc的名称
m_NpcSettingIdx = 0; // Npc的设定文件索引
m_CorpseSettingIdx = 0; // Body的设定文件索引
ZeroMemory(ActionScript,32);
ZeroMemory(ScriptFile,sizeof(ScriptFile)); // chỉ thêm dòng này để khởi tạo
m_ActionScriptID = 0;
m_TrapScriptID = 0;
...........................
Thêm hàm OnTrap() vào 1 số trạng thái có sẵn của nhân vật
void KNpc::OnRun()
{
OnTrap(); // dòng thêm
WaitForFrame();
ServeMove(m_CurrentRunSpeed);
}
void KNpc::OnWalk()
{
OnTrap(); // dòng thêm
#ifndef _SERVER
// 处理客户端的动画换帧等……
#endif
WaitForFrame();
ServeMove(m_CurrentWalkSpeed);
}
BOOL KNpc::OnJump()
{
OnTrap(); // dòng thêm
ServeJump(m_CurrentJumpSpeed);
if (WaitForFrame())
{
DoStand();
m_ProcessAI = 1;
return FALSE;
}
return TRUE;
}
Thêm và xử lý hàm OnTrap()
void KNpc::OnTrap() // chức năng: tạo trap by thienthanden2
{
if (IsPlayer())
{
switch (SubWorld[m_SubWorldIndex].m_SubWorldID)
{
case 115: // ID của map Cái Bang xem trong worldset.ini, muốn tạo trap ở map khác thì thêm 1 case khác
{
int nPosX = 0;
int nPosY = 0;
GetMpsPos(&nPosX, &nPosY);
if ((nPosY/32)>4032) // Cái Bang to Dương Châu
{
sprintf(ScriptFile,"\\script\\global\\trap\\caibang\\caibang2duongchau .lua"); // Đường dẫn file script lua sẽ chạy khi giẫm lên trap này
#ifdef _SERVER
Player[m_nPlayerIdx].ExecuteScript(ScriptFile, "main", 0);
#endif
ZeroMemory(ScriptFile,sizeof(ScriptFile));
}
}break;
default:
break;
}
}
}
Tọa độ (nPosY/32)>4032) do các bạn sử dụng hàm check tọa độ trong game mà có, vì trường hợp trên là dạng đường đi rộng nên chỉ cần kiểm tra tọa độ Y, nếu đường đi hẹp thì kiểm tra bằng cách sau, ví dụ từ Dương Châu qua Cái Bang:
if ((nPosY/32)<2819 && (nPosX/32)>1945 && (nPosX/32)<1970) //Từ Duơng Châu qua Cái Bang có 1 đường đi rất hẹp
3. Cuối cùng các bạn tạo 1 file CaiBang2DuongChau.lua theo đường dẫn thư mục đã chỉ định phía trên có nội dung như sau, các bạn có thể code thêm cái gì đó tùy ý:
--Script by Ken Nguyen (thienthanden2)
Include("\\script\\global\\serverlib.lua");
Include("\\script\\global\\sourcejx49.lua");
function main()
NewWorld(16,1955,2823)
SetFightState(1)
end;
Thế là tạo xong 1 trap mới ;) Ở trên có thể áp dụng cho trường hợp đường đi có chiều ngang, với chiều dọc thì các bạn tùy chỉnh lại 1 chút xíu thôi, Vấn đề đặt ra là nếu cửa có góc 45 độ xéo thì có check được chính xác ko? Câu trả lời là YES, nhưng đó là phần dành cho các bạn suy nghĩ. Chúc các bạn thành công. ;))
Có lẽ việc mò ra trap đôi khi làm chúng ta đau đầu, vì có nhiều trap quá khó để tìm ra. Thôi thì chúng ta không cần nhọc công nữa mà code luôn từ source cho nhanh. Hôm nay mình xin hướng dẫn cách tạo 1 trap mới ở bất kỳ nơi đâu.
Mình xin lấy ví dụ trap từ Cái Bang qua Dương Châu. Đây là cách kiểm tra tọa độ trong game bằng script lua :
function kiemtratoado()
w,x,y = GetWorldPos();
Msg2Player("Ban dang o Map "..w.." Toa do "..x..", "..y)
end;
Bây giờ bắt đầu thay đổi source:
1. File \JX\swrod3\SwordOnline\Sources\Core\Src\KNpc.h
Tìm và khai báo thêm 1 hàm mới
.....................................
int m_NpcSettingIdx; // Npc的设定文件索引
int m_CorpseSettingIdx; // Npc的尸体定义索引
char ActionScript[80]; // Npc的行为脚本
char ScriptFile[100]; //dòng thêm để chứa đường dẫn file script .lua tạm thời
DWORD m_ActionScriptID; // Npc的行为脚本ID(使用时用这个来检索 )
DWORD m_TrapScriptID; // Npc的当前Trap脚本ID;
..............................................
void OnWalk();
void DoRun();
void OnRun();
void OnTrap(); // dòng thêm
void DoSkill(int nX, int nY);
int DoOrdinSkill(KSkill * pSkill, int nX, int nY);
void OnSkill();
............................................
2. File \JX\swrod3\SwordOnline\Sources\Core\Src\KNpc.cpp
Tìm hàm void KNpc::Init() và thêm
.........................
ZeroMemory(Name, 32); // Npc的名称
m_NpcSettingIdx = 0; // Npc的设定文件索引
m_CorpseSettingIdx = 0; // Body的设定文件索引
ZeroMemory(ActionScript,32);
ZeroMemory(ScriptFile,sizeof(ScriptFile)); // chỉ thêm dòng này để khởi tạo
m_ActionScriptID = 0;
m_TrapScriptID = 0;
...........................
Thêm hàm OnTrap() vào 1 số trạng thái có sẵn của nhân vật
void KNpc::OnRun()
{
OnTrap(); // dòng thêm
WaitForFrame();
ServeMove(m_CurrentRunSpeed);
}
void KNpc::OnWalk()
{
OnTrap(); // dòng thêm
#ifndef _SERVER
// 处理客户端的动画换帧等……
#endif
WaitForFrame();
ServeMove(m_CurrentWalkSpeed);
}
BOOL KNpc::OnJump()
{
OnTrap(); // dòng thêm
ServeJump(m_CurrentJumpSpeed);
if (WaitForFrame())
{
DoStand();
m_ProcessAI = 1;
return FALSE;
}
return TRUE;
}
Thêm và xử lý hàm OnTrap()
void KNpc::OnTrap() // chức năng: tạo trap by thienthanden2
{
if (IsPlayer())
{
switch (SubWorld[m_SubWorldIndex].m_SubWorldID)
{
case 115: // ID của map Cái Bang xem trong worldset.ini, muốn tạo trap ở map khác thì thêm 1 case khác
{
int nPosX = 0;
int nPosY = 0;
GetMpsPos(&nPosX, &nPosY);
if ((nPosY/32)>4032) // Cái Bang to Dương Châu
{
sprintf(ScriptFile,"\\script\\global\\trap\\caibang\\caibang2duongchau .lua"); // Đường dẫn file script lua sẽ chạy khi giẫm lên trap này
#ifdef _SERVER
Player[m_nPlayerIdx].ExecuteScript(ScriptFile, "main", 0);
#endif
ZeroMemory(ScriptFile,sizeof(ScriptFile));
}
}break;
default:
break;
}
}
}
Tọa độ (nPosY/32)>4032) do các bạn sử dụng hàm check tọa độ trong game mà có, vì trường hợp trên là dạng đường đi rộng nên chỉ cần kiểm tra tọa độ Y, nếu đường đi hẹp thì kiểm tra bằng cách sau, ví dụ từ Dương Châu qua Cái Bang:
if ((nPosY/32)<2819 && (nPosX/32)>1945 && (nPosX/32)<1970) //Từ Duơng Châu qua Cái Bang có 1 đường đi rất hẹp
3. Cuối cùng các bạn tạo 1 file CaiBang2DuongChau.lua theo đường dẫn thư mục đã chỉ định phía trên có nội dung như sau, các bạn có thể code thêm cái gì đó tùy ý:
--Script by Ken Nguyen (thienthanden2)
Include("\\script\\global\\serverlib.lua");
Include("\\script\\global\\sourcejx49.lua");
function main()
NewWorld(16,1955,2823)
SetFightState(1)
end;
Thế là tạo xong 1 trap mới ;) Ở trên có thể áp dụng cho trường hợp đường đi có chiều ngang, với chiều dọc thì các bạn tùy chỉnh lại 1 chút xíu thôi, Vấn đề đặt ra là nếu cửa có góc 45 độ xéo thì có check được chính xác ko? Câu trả lời là YES, nhưng đó là phần dành cho các bạn suy nghĩ. Chúc các bạn thành công. ;))