hongtu1
11-10-09, 01:57 PM
Thấy Box jx dạo nào trầm quá nên mình lập topic góp vui.
Như các bạn đã biết file *.dat quy định Npc, trap, obj, SetFightState. Đối với những map mà server đã có full những file *.dat như Ba Lang Huyện, Nam Nhạc Trấn thì mình không nói rồi vì nó đã có đầy đủ Npc, trap, obj, SetFightState. Nhưng đối với những map mà ta add thêm vào chỉ có file *.wor như Đại Lý, Cái Bang thì làm sao để add được Npc, obj và nhất là trap, SetFightState . Npc, obj thì các ban chắc ai cũng biết (nếu ai chưa biết thì vui lòng tìm xem lại bài của anh Akari), đây mình chỉ đề cập đến cách add trap và SetFightState.
Ai đã tìm hiểu về file *.dat rồi có nhận thấy rằng file *.dat của trap và SetFightState khác so với file *.dat của Npc và obj (cả về cấu trúc mã hex) là nó có tác dụng tới Player. Tức là khi Player di chuyển tới tọa độ đó thì nó sẽ gọi 1 file *.lua và thực thi nội dung của file này. Đường dẫn tới file *.lua đó được quy định trong đoạn mã hex của file *.dat ( nói thật là giờ mình vẫn chưa biết nó được mã hóa kiểu gì, nếu ai biết rồi thì có thể giải giúp mình được thì thank nhiều). Nhưng đoạn mã đó lại không quy định tọa độ bản đồ. Tức là khi ta thay đổi tên của file *.dat thì tọa độ tác dụng sẽ thay đổi theo. Do vậy mình có thể lợi dụng cái này để add trap và SetFightState cho những map khác. Sau đây mình lấy 1 tọa độ làm gốc và làm mẫu luôn đó là tọa độ cổng ra phí Đông của Ba Lăng Huyện (202/206).
Ta lấy tọa độ y/2 = 101 vậy tìm đến đường dẫn \Maps\两湖区\巴陵县\v_101 (các pro thông cảm, mình viết vậy để nếu new member có đọc thì cũng có thể hiểu được )
Ta lấy tọa độ x/2 = 103 vậy trong folder v_101 ta lấy file 103_Region_S.dat
File này quy định file *.lua có đường dẫn \Script\两湖区\巴陵县\trap\巴陵县东门.l ua.
<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>
(trong file *.dat này còn có thêm cả cái bảng thông báo nên mình đã đưa tọa độ của nó về 0 tất để tiện khi đưa vào các map khác)
Nhưng khi ta đem file 103_Region_S.dat để vào các map khác thì lúc di chuyển tới đó nó vẫn thực hiện hàm trong file 巴陵县东门.lua. Ví dụ mình đem file này để add trap đi từ Cái Bang sang Dương Châu chằng hạn, thì nó vẫn thực hiện đúng chức năng cũ là SetFightState. Vậy làm sao để cho nó hiểu tọa độ này là tọa độ trap di chuyển Player từ Cái Bang sang Dương Châu. Đơn giản thôi, mình dùng hàm GetWorldPos().
Cú pháp: w,x,y = GetWorldPos()
Trong đó: w = Id map mình đang đứng
x = tọa độ x *8
y = tọa đô y*16
Dùng hàm if..then để kiểm tra, nếu nhân vật đứng ở Ba Lang Huyện thì SetFightState, còn đứng ở Cái Bang thì di chuyển nhân vật sang Dương Châu.
function main(sel)
w,x,y = GetWorldPos()
if (w == 53) then
if ( GetFightState() == 0 ) then
SetPos(1654, 3242)
SetFightState(1)
else
SetPos(1652, 3237)
SetFightState(0)
end;
AddStation(10)
end
if (w == 115) then
NewWorld(80,244*8,177*16)
end
end;
Ta thấy rằng tọa độ trap di chuyển từ Cái Bang sang Dương Châu là 192/252.
Ta lấy 192/2 = 96, 252/2 = 126. Vậy ta copy file 103_Region_S.dat vào \Maps\中原南区\丐帮\丐帮\v_096\ rồi đổi tên thành 126_Region_S.dat. Ok, giờ chạy lại server và xem kết quả.
Như vậy, với cách làm này ta có thể add full trap một cách dễ dàng hơn và add SetFightState cho nhân vật khi ra vào thành mà chỉ cần quan tâm tới 1 file *.dat và 1 file *.lua. Thậm chí, mở rộng hơn ta có thể dùng nó để SetTask cho nhiệm vụ ( cái này do chơi TGHM thấy có dạng nhiệm vụ này hay hay nên add vào jx cho đa dạng ).
Ví dụ mình muốn có một nhiệm vụ như sau: Long Ngũ giao nhiệm vụ cho bạn đi về phía Nam Ba Lang Huyện dò xét. Bạn đi tới tọa độ 178/212 rồi phát hiện ra tình hình, quay về báo tin cho Long Ngũ, hoàn thành nhiệm vụ:
Longngu.lua:
function main()
sonhap = 1
if (GetTask(1) == 0) then
Say("<color=yellow>Long Ngu<color>: Nguoi muon lam nhiem vu so nhap ha?",2,"Dung vay/yes","Khong muon/no")
elseif (GetTask(1) == 1) then
Say("<color=yellow>Long Ngu<color>: Nhiem vu ta giao nguoi van chua lam sao?",1,"Oi chet, Ta quen khuay di mat/no")
elseif (GetTask(1) == 2) then
Talk(4,"thuong","<color=yellow>Long Ngu<color>: The nao? Nguoi da biet duoc gi noi ta nghe xem nao.","<color=green>"..GetName().."<color>: Tai ha phat hien O phia Nam moi xuat hien may ten sat thu","<color=yellow>Long Ngu<color>: Hen chi dan lang hay bi mat trom nhu vay. Can phai di trung tri chung moi duoc.","<color=yellow>Long Ngu<color>: Nguoi cung kha lam, da hoan thanh tot nhiem vu ta giao, ta se thuong cho nguoi")
else
Say("<color=yellow>Long Ngu<color>: Sao khong lo luyen cong di Dai hiep",1,"Ket thuc doi thoat/no")
end
end;
function yes()
Say("<color=yellow>Long Ngu<color>: Gan day ta nghe dan lang ke rang ho rat hay bi mat trom, Nguoi hay di ve phi Nam tim hieu xem su that do dau",1,"Ok. Ta di ngay/no")
SetTask(1,1)
end;
function thuong()
AddRepute(10)
Msg2Player("Nhan duoc 10 diem Danh Vong")
end;
function no()
end;
Àh, một vấn đề nữa ở đây là nếu 1 map cần add nhiều trap, SetFightState hoặc SetTask thì kiểm tra ID map vẫn chưa đủ nên ta cần phải kiểm tra thêm cả tọa độ nhân vật đang đứng.
Dùng hàm floor : chia lấy phần nguyên
Cú pháp: tdx = floor(x / 8) : lấy x chia cho 8 rồi gán kết quả vào tdx
Vậy trong file 巴陵县东门.lua của mình sẽ viết như sau:
function main(sel)
w,x,y = GetWorldPos()
tdx = floor(x / 8)
tdy = floor(y / 16)
if (w == 53) and (tdx >= 206 ) and (tdx <= 207) and (tdy == 202)then
if ( GetFightState() == 0 ) then
SetPos(1654, 3242)
SetFightState(1)
else
SetPos(1652, 3237)
SetFightState(0)
end;
AddStation(10)
end
if (w == 115) then
NewWorld(80,244*8,177*16)
end
if (w == 53) and
(tdx == 178) and
(tdy == 212) and
(GetTask(1) == 1 ) then
Talk(1,"","Thi ra la vay!Tai day moi xuat hien may ten sat thu, Ta phai ve bao tin cho <color=yellow>Long Ngu<color> biet moi duoc")
SetTask(1,2)
end
end;
Tương tự , ta đổi tên file 103_Region_S.dat thành 089_Region_S.dat và copy file vào \Maps\两湖区\巴陵县\v_106\ . Giờ add file longngu.lua vào npc nào đó rồi thử làm nhiệm vụ xem. Kết quả nè:
<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>
Nếu ai chưa hiểu thì có thể download file mấy file của mình về tham khảo:
<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>
Topic kết thúc. Mod đọc bài thấy có ích thì cho xin cái ghim nha kẻo để lâu bị đẩy về sau bị mất tích
Àh nhân tiện share file *.wor map Tương Dương của võ lâm 2 cho mọi người ai đã add thành công map Phong Thần thì về add thử dùm mình vào xem có được không, nếu thành công thì chỉ cho mình với nha. Thank nhiều.
Link:<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>
Mình add vào toàn bị đen màn hình vậy nè:
<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>
Như các bạn đã biết file *.dat quy định Npc, trap, obj, SetFightState. Đối với những map mà server đã có full những file *.dat như Ba Lang Huyện, Nam Nhạc Trấn thì mình không nói rồi vì nó đã có đầy đủ Npc, trap, obj, SetFightState. Nhưng đối với những map mà ta add thêm vào chỉ có file *.wor như Đại Lý, Cái Bang thì làm sao để add được Npc, obj và nhất là trap, SetFightState . Npc, obj thì các ban chắc ai cũng biết (nếu ai chưa biết thì vui lòng tìm xem lại bài của anh Akari), đây mình chỉ đề cập đến cách add trap và SetFightState.
Ai đã tìm hiểu về file *.dat rồi có nhận thấy rằng file *.dat của trap và SetFightState khác so với file *.dat của Npc và obj (cả về cấu trúc mã hex) là nó có tác dụng tới Player. Tức là khi Player di chuyển tới tọa độ đó thì nó sẽ gọi 1 file *.lua và thực thi nội dung của file này. Đường dẫn tới file *.lua đó được quy định trong đoạn mã hex của file *.dat ( nói thật là giờ mình vẫn chưa biết nó được mã hóa kiểu gì, nếu ai biết rồi thì có thể giải giúp mình được thì thank nhiều). Nhưng đoạn mã đó lại không quy định tọa độ bản đồ. Tức là khi ta thay đổi tên của file *.dat thì tọa độ tác dụng sẽ thay đổi theo. Do vậy mình có thể lợi dụng cái này để add trap và SetFightState cho những map khác. Sau đây mình lấy 1 tọa độ làm gốc và làm mẫu luôn đó là tọa độ cổng ra phí Đông của Ba Lăng Huyện (202/206).
Ta lấy tọa độ y/2 = 101 vậy tìm đến đường dẫn \Maps\两湖区\巴陵县\v_101 (các pro thông cảm, mình viết vậy để nếu new member có đọc thì cũng có thể hiểu được )
Ta lấy tọa độ x/2 = 103 vậy trong folder v_101 ta lấy file 103_Region_S.dat
File này quy định file *.lua có đường dẫn \Script\两湖区\巴陵县\trap\巴陵县东门.l ua.
<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>
(trong file *.dat này còn có thêm cả cái bảng thông báo nên mình đã đưa tọa độ của nó về 0 tất để tiện khi đưa vào các map khác)
Nhưng khi ta đem file 103_Region_S.dat để vào các map khác thì lúc di chuyển tới đó nó vẫn thực hiện hàm trong file 巴陵县东门.lua. Ví dụ mình đem file này để add trap đi từ Cái Bang sang Dương Châu chằng hạn, thì nó vẫn thực hiện đúng chức năng cũ là SetFightState. Vậy làm sao để cho nó hiểu tọa độ này là tọa độ trap di chuyển Player từ Cái Bang sang Dương Châu. Đơn giản thôi, mình dùng hàm GetWorldPos().
Cú pháp: w,x,y = GetWorldPos()
Trong đó: w = Id map mình đang đứng
x = tọa độ x *8
y = tọa đô y*16
Dùng hàm if..then để kiểm tra, nếu nhân vật đứng ở Ba Lang Huyện thì SetFightState, còn đứng ở Cái Bang thì di chuyển nhân vật sang Dương Châu.
function main(sel)
w,x,y = GetWorldPos()
if (w == 53) then
if ( GetFightState() == 0 ) then
SetPos(1654, 3242)
SetFightState(1)
else
SetPos(1652, 3237)
SetFightState(0)
end;
AddStation(10)
end
if (w == 115) then
NewWorld(80,244*8,177*16)
end
end;
Ta thấy rằng tọa độ trap di chuyển từ Cái Bang sang Dương Châu là 192/252.
Ta lấy 192/2 = 96, 252/2 = 126. Vậy ta copy file 103_Region_S.dat vào \Maps\中原南区\丐帮\丐帮\v_096\ rồi đổi tên thành 126_Region_S.dat. Ok, giờ chạy lại server và xem kết quả.
Như vậy, với cách làm này ta có thể add full trap một cách dễ dàng hơn và add SetFightState cho nhân vật khi ra vào thành mà chỉ cần quan tâm tới 1 file *.dat và 1 file *.lua. Thậm chí, mở rộng hơn ta có thể dùng nó để SetTask cho nhiệm vụ ( cái này do chơi TGHM thấy có dạng nhiệm vụ này hay hay nên add vào jx cho đa dạng ).
Ví dụ mình muốn có một nhiệm vụ như sau: Long Ngũ giao nhiệm vụ cho bạn đi về phía Nam Ba Lang Huyện dò xét. Bạn đi tới tọa độ 178/212 rồi phát hiện ra tình hình, quay về báo tin cho Long Ngũ, hoàn thành nhiệm vụ:
Longngu.lua:
function main()
sonhap = 1
if (GetTask(1) == 0) then
Say("<color=yellow>Long Ngu<color>: Nguoi muon lam nhiem vu so nhap ha?",2,"Dung vay/yes","Khong muon/no")
elseif (GetTask(1) == 1) then
Say("<color=yellow>Long Ngu<color>: Nhiem vu ta giao nguoi van chua lam sao?",1,"Oi chet, Ta quen khuay di mat/no")
elseif (GetTask(1) == 2) then
Talk(4,"thuong","<color=yellow>Long Ngu<color>: The nao? Nguoi da biet duoc gi noi ta nghe xem nao.","<color=green>"..GetName().."<color>: Tai ha phat hien O phia Nam moi xuat hien may ten sat thu","<color=yellow>Long Ngu<color>: Hen chi dan lang hay bi mat trom nhu vay. Can phai di trung tri chung moi duoc.","<color=yellow>Long Ngu<color>: Nguoi cung kha lam, da hoan thanh tot nhiem vu ta giao, ta se thuong cho nguoi")
else
Say("<color=yellow>Long Ngu<color>: Sao khong lo luyen cong di Dai hiep",1,"Ket thuc doi thoat/no")
end
end;
function yes()
Say("<color=yellow>Long Ngu<color>: Gan day ta nghe dan lang ke rang ho rat hay bi mat trom, Nguoi hay di ve phi Nam tim hieu xem su that do dau",1,"Ok. Ta di ngay/no")
SetTask(1,1)
end;
function thuong()
AddRepute(10)
Msg2Player("Nhan duoc 10 diem Danh Vong")
end;
function no()
end;
Àh, một vấn đề nữa ở đây là nếu 1 map cần add nhiều trap, SetFightState hoặc SetTask thì kiểm tra ID map vẫn chưa đủ nên ta cần phải kiểm tra thêm cả tọa độ nhân vật đang đứng.
Dùng hàm floor : chia lấy phần nguyên
Cú pháp: tdx = floor(x / 8) : lấy x chia cho 8 rồi gán kết quả vào tdx
Vậy trong file 巴陵县东门.lua của mình sẽ viết như sau:
function main(sel)
w,x,y = GetWorldPos()
tdx = floor(x / 8)
tdy = floor(y / 16)
if (w == 53) and (tdx >= 206 ) and (tdx <= 207) and (tdy == 202)then
if ( GetFightState() == 0 ) then
SetPos(1654, 3242)
SetFightState(1)
else
SetPos(1652, 3237)
SetFightState(0)
end;
AddStation(10)
end
if (w == 115) then
NewWorld(80,244*8,177*16)
end
if (w == 53) and
(tdx == 178) and
(tdy == 212) and
(GetTask(1) == 1 ) then
Talk(1,"","Thi ra la vay!Tai day moi xuat hien may ten sat thu, Ta phai ve bao tin cho <color=yellow>Long Ngu<color> biet moi duoc")
SetTask(1,2)
end
end;
Tương tự , ta đổi tên file 103_Region_S.dat thành 089_Region_S.dat và copy file vào \Maps\两湖区\巴陵县\v_106\ . Giờ add file longngu.lua vào npc nào đó rồi thử làm nhiệm vụ xem. Kết quả nè:
<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>
Nếu ai chưa hiểu thì có thể download file mấy file của mình về tham khảo:
<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>
Topic kết thúc. Mod đọc bài thấy có ích thì cho xin cái ghim nha kẻo để lâu bị đẩy về sau bị mất tích
Àh nhân tiện share file *.wor map Tương Dương của võ lâm 2 cho mọi người ai đã add thành công map Phong Thần thì về add thử dùm mình vào xem có được không, nếu thành công thì chỉ cho mình với nha. Thank nhiều.
Link:<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>
Mình add vào toàn bị đen màn hình vậy nè:
<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>