PDA

View Full Version : [JX] Source code - Tạo trap mới cho map



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. ;))

assaa
05-02-13, 09:24 PM
Hay quá bác ơi. thank bác nhiều :D

Bi_Dep_Trai
05-02-13, 09:37 PM
cái nài có thể chạy qua chạy lại maps giống VNG hả

Edward_Newgate
05-02-13, 09:44 PM
Nhưng mà cái này thì mỗi maps lại phải thêm vào source à :-?
Nên làm cái nào mà chỉ thêm 1 lần ở source, còn muốn làm trap thì edit script ý, thế có vẻ dễ hơn

thaihoa91
05-02-13, 09:47 PM
Đơn giản thui, cho nó load các thông số toạ độ từ .txt là dc ấy mà ;))

Bi_Dep_Trai
05-02-13, 09:48 PM
Đơn giản thui, cho nó load các thông số toạ độ từ .txt là dc ấy mà ;))

chạy qua chạy lại maps hả anh

thaihoa91
05-02-13, 09:51 PM
chạy qua chạy lại maps hả anh

<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>

XiTop
05-02-13, 09:51 PM
chạy qua chạy lại maps hả anh

chính xác rồi bạn,di chuyển wa lại giữa các map thông với nhau như VNG ấy:-c

thaihoa91
05-02-13, 09:57 PM
Thật ra chỉ có 1 số maps đường dẫn trap ko đúng theo tên truyền thống nên khó lấy dc thì có thể dùng code này và chỉnh sửa cho nó load .txt sẽ linh hoạt hơn, còn đa số thì dùng trap .dat vẫn ổn, vì code này sẽ chạy liên tục để check nhân vật, nên sẽ tốn thêm bộ nhớ ;))

assaa
05-02-13, 10:02 PM
Thật ra chỉ có 1 số maps đường dẫn trap ko đúng theo tên truyền thống nên khó lấy dc thì có thể dùng code này và chỉnh sửa cho nó load .txt sẽ linh hoạt hơn, còn đa số thì dùng trap .dat vẫn ổn, vì code này sẽ chạy liên tục để check nhân vật, nên sẽ tốn thêm bộ nhớ ;))
Anh hòa có thể demo cách làm load từ file .txt cho tui em đc mở mang tầm mắt đc ko

thaihoa91
05-02-13, 10:08 PM
Anh hòa có thể demo cách làm load từ file .txt cho tui em đc mở mang tầm mắt đc ko

Thì load zống kiểu RankSettings.txt ấy !

Nội dung .txt thì đại khái là


TRAPX TRAPY
121212 343434

thienthanden2
05-02-13, 11:12 PM
Thật ra chỉ có 1 số maps đường dẫn trap ko đúng theo tên truyền thống nên khó lấy dc thì có thể dùng code này và chỉnh sửa cho nó load .txt sẽ linh hoạt hơn, còn đa số thì dùng trap .dat vẫn ổn, vì code này sẽ chạy liên tục để check nhân vật, nên sẽ tốn thêm bộ nhớ ;))

Bạn nói có lý, chừng nào bí quá mới xài, đa số trap có thể tìm được, với lại có thể dùng để đặt thêm ở 1 nơi nào đó mà mình muốn.

tam241992
06-02-13, 12:27 AM
xài cái này thì nó lag Map lắm thì phải. :)

thaihoa91
06-02-13, 12:33 AM
Bạn nói có lý, chừng nào bí quá mới xài, đa số trap có thể tìm được, với lại có thể dùng để đặt thêm ở 1 nơi nào đó mà mình muốn.

1 là ngâm cái cách load truyền thống của nó ! Cái kiểu load truyền thống tui cũng đang ngâm mà chưa hiểu lắm mấy cái file Obj.dat hay Trap.dat mà nó khai báo ra !
2 là nếu xài cách này thì hạn chế đến mức tối thiểu ;)) Chỉ những trap nào mình cần mà ko lấy dc từ cách làm truyền thống thì hãy dùng, còn ko cần thiết dùng thì ko nên :D

thaihoa91
07-02-13, 12:46 AM
Thật ra code hay cách làm ko riêng về trap mà các chức năng khác cũng thế, nhìu cách làm, nhưng wan trọng nhất là chọn cách nào ít tốn bộ nhớ khi xài nhất, vì code bản thân khá nhìu chức năng, nên việc hạn chế tốn dc bao nhiu bộ nhớ thì cứ hạn chế !

thienthanden2
07-02-13, 02:06 AM
ko nên làm theo cách này. ko linh động.
Nên tạo 1 file chứa các thông số rồi load thôi. làm kiểu này cứ muốn thêm trap lại phải mở source
Cách thứ 2: ko cần thiết check tọa độ trong source. chỉ thự thi script thuộc trap của maps đó. trong script check tọa độ nằm trong khoảng nào. nếu nằm trong khoảng đó thì move npc. ngược lại thì ko làm gì cả.
Thích cách nào làm cách đó. mỗi cách có ưu nhược điểm riêng

thaihoa đã nói rùi, bạn còn nói lại chi nữa :) . Giả sử bí ko tìm ra trap, Script bạn nói cũng phải chạy để check thui, chứ đâu phải ko ở trong tọa độ đó thì nó ko chạy đâu nhở. hihi. Check đâu chẳng đc, Tùy theo sở thix mỗi người.

LeHuyetVoHon
07-02-13, 08:45 PM
cứ cho nó bét tè lè nhè đi,sao phải khổ vậy.chơi off chứ ko on đâu mà phải sợ ;;)

thaihoa91
07-02-13, 10:27 PM
cứ cho nó bét tè lè nhè đi,sao phải khổ vậy.chơi off chứ ko on đâu mà phải sợ ;;)

Phải tập code cẩn thận chứ ;)) vì tui ko đơn giản chỉ dev Source mỗi game này :)) nên fải tập tối ưu code thui ;))

thienthanden2
07-02-13, 10:41 PM
Dùng Script linh động hơn check trong source. vấn đề ở đây là làm cách nào cho dễ edit. chứ làm như cách của bạn. mỗi lần thêm hay edit gì phải mở src lên. giả sử sv bạn share, thì người dùng sẽ ko edit dc. nên dùng script hoac file txt là linh động cho việc này :D

Thì thaihoa đã nói ở phần trên rùi mà bạn nhắc lại làm j, tui chỉ hướng dẫn cho newbie làm quen source, muốn tùy chỉnh sao là do mọi người. :P