songtu
28-04-15, 09:58 PM
cái này cũ rồi, nhưng lâu lâu vào chả thấy ai share gì , nay mạo muội viết cái thớt này trong Releasses, mình sẽ viết chi tiết từng bước một để một người mới cũng có thể hiểu đc!!
Mọi người cho ý kiến cái nhể !!
Let's start!!
Mình sẽ chia nhỏ bài viết của mình thành nhiều phần!! vì lý do công việc ko có thời gian onl trên 4rum đc nhiều!!!
Phần 1 : Những thứ cần thiết và các file liên quan đến khung tu luyện (Xiulian)
Phần mềm các bạn cần là : notepad++, axppacker,...
Nguyên liệu cần thiết : nó là 2 file chuẩn của nhà phát hành là Xiulian.lua và Xiulian.layout.xml, nên lấy của FPT (vì của VNG bản 3D họ đổi các TypeWindow (tức là kiểu của cửa sổ) trong file .xml )
tại sao phải cần 2 file đó: vì xml tạo giao diện cho tlbb, và .lua để liên kết với giao diện đó ....
Lưu ý : với những bản client ngày xưa, thời mà chưa có khung tu luyện, thì cần tạo thẻ ở selfequib.layout.xml ... rồi lại phải thêm thư mục, tốt nhất nên kiếm client ver 3.0 để làm!! (vì nó đã có sẵn thư mục rồi)
Câu hỏi đặt ra là : client có sẵn khung tu luyện rồi, sao mà khi chơi game chức năng đó (ở tab tu luyện ko hiện ra..?) câu trả lời rất đơn giản!! Vì file game.exe không làm đc điều này (hoặc file .dll ko có chứa thư viện cho việc gọi khung tu luyện lên)
Giờ nhiệm vụ là : gọi khung tu luyện từ client (tức là khi nhấp vào tab Tu Luyện thì giao diện tu luyện sẽ hiện lên) và tương tác giữa client và server (tức là khi ta sử dụng công lực đan, thì chỉ số công lực sẽ đc cập nhật lên khung hiển thị Tu luyện!)
Link 2 file lấy từ FPT (chưa chỉnh sửa):
https://drive.google.com/file/d/0B6mjZdT-L1CQUHFzSjQ0R1VOYUU/view?usp=sharing
Phần 2 : Gọi khung giao diện Xiulian từ client.
B1:Gọi bất cứ một khung nào cũng vậy (trừ một số cái đặc biệt trong file config) thì đều liên quan đến file "InterfaceEx.txt" trong Config.axp , file đó khai báo nhưng khung đc gọi. Nếu file đó của bạn mà chưa đc khai báo cho Xiulian thì bạn có thể lấy từ bản của nhà phát hành, rồi tìm đến dòng khai báo cho khung đó, copy vào file của mình và lưu lại rồi pack (nén lại) lại vào trong Config.axp của chính mình!!
264 Xiulian Xiulian\Xiulian.layout.xml Xiulian\Xiulian.lua 2 xljs 19 20 修炼
B2: dùng lệnh PushEvent("UI_COMMAND",ID khung) --- lệnh này có nghĩa là gọi đến sự kiện UI_COMMAND , với ID là ID của khung giao diện. Tại sao lại là event UI_COMMAND vì event này file game nó hiểu đc,(tạm hiểu vậy thôi, sâu hơn nữa là váng đầu đấy). và một câu hỏi nữa là làm thế nào để biết đc số khung của giao diên? ID của khung được quy định trong file lua (trong trường hợp này là xiulian.lua) và không được trùng với số khung khác!! và nó thường đi kèm vs lời gọi khung bằng câu lệnh this:Show().
Cũng có thể gọi khung từ server nhưng cái này mình sẽ nói sau.
Phần 3: Bắt tay vào làm nào!
Lưu ý các bạn nên backup lại các file của mình để tránh ...., mình thì tạo luôn 1 file Interface.axp_copy ra trong thư mục Data, dùng tool mở file copy ra rồi ghi đè lên file cũ!!
Mình đặt khung Xiulian của mình với ID là 20150109 (trùng vs hôm làm cái này chẳng hạn!!)
Mở SelfEquip.lua ra, tìm đến hàm XiuLian_Page_Switch() nội dung trong hàm sẽ có có câu lệnh PushEvent("UI_COMMAND",20150109 )
function XiuLian_Page_Switch()
PushEvent("UI_COMMAND",20150109)
end
Tiếp sửa trong Xiulian.lua nữa ..(giờ mục đíc là gọi đc cái khung nó hiển thị lên đã, còn màu mè tính sau!)
tìm đến hàm Xiulian_OnEvent(event) sửa nội dung trong hàm if ( event == "OPEN_XIULIAN_PAGE" ) then ... end!!
xóa luôn dòng if (event == "OPEN_XIULIAN_PAGE" ) vì event này game exe ko hiểu, thay vào đó là :
if ( event == "UI_COMMAND" and tonumber(arg0)==20150109 ) then
....
this:Show();
PushDebugMessage("Begin_Load!!")
...
end
các bạn làm thế nào mà nó hiện lên đc cái khung và hiện thông báo lên là đc bước đầu!!, nếu ko hiện thì phải xóa một thứ nữa, .... tại có một số hàm game ko load đc là nó ko load đến hàm this: Show() đâu!!
http://i.imgur.com/xl3lgiX.jpg
http://i.imgur.com/fwM8Tsc.jpg
Phần 3: Hiển thị Icon, và các thứ linh tinh!!
Sau khi các bạn làm được , và nó hiển thị đc khung tu luyện lên, nhưng vẫn chưa có gì cả chỉ là khung và chưa có hình ảnh , chưa có cả hiện các chỉ số nữa!!
B1: tạo tính năng cập nhật cho khung tu luyện!!(cái này khó giải thích nhể ???) đại loại là khi nhấn vào item Công lực đan, thì số công lực sẽ hiển thị lên khung tu luyện!!
Có thể nói là tạo một vòng tròn liên kết giữa client và sever , rồi server lại liên kết vs khung!! Tư tưởng là như vậy nên ta làm như sau:
ý tưởng sẽ là : khi click vào tab tu luyện thì sẽ gọi khung lên, đồng thời cũng gửi tín hiệu về cho sever ở một script nào đó, sau đó script đó có nhiệm vụ gửi dữ liệu lại cho khung!
cách làm: Ngay trong lời gọi khung ở client, trong file Xiulian.lua các bạn viết :
if ( event == "UI_COMMAND" and tonumber(arg0)==20150109 ) then
if(this:IsVisible()) then
this:Hide();
return;
end
Clear_XSCRIPT();
Set_XSCRIPT_Function_Name("ReturnAttrXiulian");
Set_XSCRIPT_ScriptID(390101);
Set_XSCRIPT_Parameter(0,1);
Set_XSCRIPT_ParamCount(1);
Send_XSCRIPT();
local selfUnionPos = Variable:GetVariable("SelfUnionPos");
if(selfUnionPos ~= nil) then
Xiulian_Frame:SetProperty("UnifiedPosition", selfUnionPos);
end
XIULIAN_BOOK_SELECT = 1;
XIULIAN_MIJI_SELECT = -1;
this:Show();
Xiulian_SetTabState()
end
sr every once!! dịp nghỉ phải được uống nhiều nên rất ít khi tỉnh!!
đoạn code trên mình sử dụng Xscript (bạn nên tìm hiểu về cái này kỹ hơn nếu chưa biết, mây topic gần đây rất hay nói về nó) gọi đến hàm "ReturnAttrXiulian" , hàm này đc khai báo trong một Script nào đó(các bạn tự tạo, ví dụ:Xiulian.lua) với ID là 390101. Hơn hết ,để Xscript hoạt động đc cần khai báo trong AllowableScriptFunc.txt trong sever. Điều quan trọng ở đây là trong Script Xiulian.lua mình sẽ dùng cấu trúc sau để gửi data đến Client:
BeginUICommand( sceneId )
UICommand_AddInt( sceneId, gongli )
.......
EndUICommand( sceneId )
DispatchUICommand( sceneId, selfId, 20150425)
Như vậy bên Client ở file Xiulian.lua trong hàm Xiulian_OnEvent(event) ta phải khai báo:
if ( event == "UI_COMMAND" and tonumber(arg0)==20150425 ) then
xiulian_gongli=Get_XParam_INT(0);
.....
Xiulian_Update();
Xiulian_JingJie_Selected_Update();
Xiulian_SetSelectState()
end
để nhận dữ liệu từ sever và có các khai báo các hàm để cập nhật hiển thị ngay trên khung!!
Nhân tiện nói về hàm :trong file lua ở client thì có những hàm mặc định và cách khai báo của nó (các bạn xem nhiều rồi sẽ quen vs cách thức khai báo của nó!).Những hàm mặc định này là gì , là những hàm mà game tự hiểu đc mà ko phải do vocker địn nghĩa (thì cũng là người nghĩ ra cả mà!) ví dụ như :_PreLoad() , _OnLoad(), _OnEvent(event) và bên cạnh đó không kém phần quan trọng là các hàm do moder or vocker khai báo,những hàm này có thể đc gọi bởi những hàm trong thân file lua và cũng có thể đc gọi từ file .xml. Điển hình nhất là khi tắt một khung giao diện, khi các bạn click chuột vào cái nút X ở cửa sổ , tức là bạn đã thực hiện hàm Close ở khung .xml đc gửi để file lua, hoặc xử lý ngay tại khung (nôm na thế thôi!!).
Như ta đã biết các file Xml là các khung giao diện , là các windows(các cửa sổ) , có thể hiểu là một đối tượng nhỏ đi!! Chúng thường có các kiểu, và tên.!! Có cửa sổ chỉ cho hiển thị ảnh mà ko cho click chuột vào, có của sổ chỉ để hiện chữ.... và cái kiểu WINDOWNS này HÌNH NHƯ đc quy định trong mấy file ở thư mục Schema, trong Interface.axp !!
Nói qua vậy thui, vào việc chính, việc vây giờ là các bạn cần hiển thị đc hình ảnh trong mấy cái ô nhỏ như mình đã làm, và thao tác click chuột trên mấy ô đó khả dụng!! Để làm đc điều đó , ta cần tìm đến vị trí của máy cái ô đó. Và trong si tiu ây sần này thì ô đầu tiên là ô "Xiulian_XinfaSkill_1 với câu trúc như sau:
<Window Type="TLBB_ActionButton" Name="Xiulian_XinfaSkill_1">
<Property Name="Position" Value="x:0.158046 y:0.040346"/>
<Property Name="AbsoluteSize" Value="w:34.000000 h:34.000000"/>
<Property Name="BackImage" Value="" />
<Event Name="Clicked" Function="Xiulian_Xinfa_Clicked(1);"/>
</Window>
Muốn hiển thị đc ảnh các bạn có thể khai báo <Property Name="BackImage" Value="" /> thành <Property Name="BackImage" Value="set:Xiulian1 image:Xiulian1_1" />, hoặc cho chuyên nghiệp hơn thì sẽ khai báo ở file lua với câu lệnh
XIULIAN_BOOKS[i]:SetProperty("BackImage",ImageXlBooks[i]) ở đây biến ImageXlBooks[i] của mình là cái "set:Xiulian1 image:Xiulian1_1". Lưu ý đổi với kiểu TLBB_ActionButton nó thường chỉ hiển thị ảnh đc với kiểu ảnh là "BackImage" mà hàm clcik chuột khả dụng!! Từ đó suy ngược lại xem cái hàm Xiulian_Xinfa_Clicked(1) nó nghĩa là gì !! Logic một tý và tính kiên trì một tý là có thể mod hệt như bản gốc!!
Đấy mới là xong phần hình ảnh! tiếp là phải hiện lên cái Tips cho nó, thế nó mới chuẩn như bản gốc được!! phần mod cái tip , mình xin chuyển sang một bài viết khác để hướng dẫn cụ thể hơn, vì nó dài và đòi hỏi một chút kỹ thuật!!
Hiện tại vì lý do công việc và bạn gái thì suốt ngày anh ơi nên khó tập trung đc !!mong anh em thông cảm !!
Mọi người cho ý kiến cái nhể !!
Let's start!!
Mình sẽ chia nhỏ bài viết của mình thành nhiều phần!! vì lý do công việc ko có thời gian onl trên 4rum đc nhiều!!!
Phần 1 : Những thứ cần thiết và các file liên quan đến khung tu luyện (Xiulian)
Phần mềm các bạn cần là : notepad++, axppacker,...
Nguyên liệu cần thiết : nó là 2 file chuẩn của nhà phát hành là Xiulian.lua và Xiulian.layout.xml, nên lấy của FPT (vì của VNG bản 3D họ đổi các TypeWindow (tức là kiểu của cửa sổ) trong file .xml )
tại sao phải cần 2 file đó: vì xml tạo giao diện cho tlbb, và .lua để liên kết với giao diện đó ....
Lưu ý : với những bản client ngày xưa, thời mà chưa có khung tu luyện, thì cần tạo thẻ ở selfequib.layout.xml ... rồi lại phải thêm thư mục, tốt nhất nên kiếm client ver 3.0 để làm!! (vì nó đã có sẵn thư mục rồi)
Câu hỏi đặt ra là : client có sẵn khung tu luyện rồi, sao mà khi chơi game chức năng đó (ở tab tu luyện ko hiện ra..?) câu trả lời rất đơn giản!! Vì file game.exe không làm đc điều này (hoặc file .dll ko có chứa thư viện cho việc gọi khung tu luyện lên)
Giờ nhiệm vụ là : gọi khung tu luyện từ client (tức là khi nhấp vào tab Tu Luyện thì giao diện tu luyện sẽ hiện lên) và tương tác giữa client và server (tức là khi ta sử dụng công lực đan, thì chỉ số công lực sẽ đc cập nhật lên khung hiển thị Tu luyện!)
Link 2 file lấy từ FPT (chưa chỉnh sửa):
https://drive.google.com/file/d/0B6mjZdT-L1CQUHFzSjQ0R1VOYUU/view?usp=sharing
Phần 2 : Gọi khung giao diện Xiulian từ client.
B1:Gọi bất cứ một khung nào cũng vậy (trừ một số cái đặc biệt trong file config) thì đều liên quan đến file "InterfaceEx.txt" trong Config.axp , file đó khai báo nhưng khung đc gọi. Nếu file đó của bạn mà chưa đc khai báo cho Xiulian thì bạn có thể lấy từ bản của nhà phát hành, rồi tìm đến dòng khai báo cho khung đó, copy vào file của mình và lưu lại rồi pack (nén lại) lại vào trong Config.axp của chính mình!!
264 Xiulian Xiulian\Xiulian.layout.xml Xiulian\Xiulian.lua 2 xljs 19 20 修炼
B2: dùng lệnh PushEvent("UI_COMMAND",ID khung) --- lệnh này có nghĩa là gọi đến sự kiện UI_COMMAND , với ID là ID của khung giao diện. Tại sao lại là event UI_COMMAND vì event này file game nó hiểu đc,(tạm hiểu vậy thôi, sâu hơn nữa là váng đầu đấy). và một câu hỏi nữa là làm thế nào để biết đc số khung của giao diên? ID của khung được quy định trong file lua (trong trường hợp này là xiulian.lua) và không được trùng với số khung khác!! và nó thường đi kèm vs lời gọi khung bằng câu lệnh this:Show().
Cũng có thể gọi khung từ server nhưng cái này mình sẽ nói sau.
Phần 3: Bắt tay vào làm nào!
Lưu ý các bạn nên backup lại các file của mình để tránh ...., mình thì tạo luôn 1 file Interface.axp_copy ra trong thư mục Data, dùng tool mở file copy ra rồi ghi đè lên file cũ!!
Mình đặt khung Xiulian của mình với ID là 20150109 (trùng vs hôm làm cái này chẳng hạn!!)
Mở SelfEquip.lua ra, tìm đến hàm XiuLian_Page_Switch() nội dung trong hàm sẽ có có câu lệnh PushEvent("UI_COMMAND",20150109 )
function XiuLian_Page_Switch()
PushEvent("UI_COMMAND",20150109)
end
Tiếp sửa trong Xiulian.lua nữa ..(giờ mục đíc là gọi đc cái khung nó hiển thị lên đã, còn màu mè tính sau!)
tìm đến hàm Xiulian_OnEvent(event) sửa nội dung trong hàm if ( event == "OPEN_XIULIAN_PAGE" ) then ... end!!
xóa luôn dòng if (event == "OPEN_XIULIAN_PAGE" ) vì event này game exe ko hiểu, thay vào đó là :
if ( event == "UI_COMMAND" and tonumber(arg0)==20150109 ) then
....
this:Show();
PushDebugMessage("Begin_Load!!")
...
end
các bạn làm thế nào mà nó hiện lên đc cái khung và hiện thông báo lên là đc bước đầu!!, nếu ko hiện thì phải xóa một thứ nữa, .... tại có một số hàm game ko load đc là nó ko load đến hàm this: Show() đâu!!
http://i.imgur.com/xl3lgiX.jpg
http://i.imgur.com/fwM8Tsc.jpg
Phần 3: Hiển thị Icon, và các thứ linh tinh!!
Sau khi các bạn làm được , và nó hiển thị đc khung tu luyện lên, nhưng vẫn chưa có gì cả chỉ là khung và chưa có hình ảnh , chưa có cả hiện các chỉ số nữa!!
B1: tạo tính năng cập nhật cho khung tu luyện!!(cái này khó giải thích nhể ???) đại loại là khi nhấn vào item Công lực đan, thì số công lực sẽ hiển thị lên khung tu luyện!!
Có thể nói là tạo một vòng tròn liên kết giữa client và sever , rồi server lại liên kết vs khung!! Tư tưởng là như vậy nên ta làm như sau:
ý tưởng sẽ là : khi click vào tab tu luyện thì sẽ gọi khung lên, đồng thời cũng gửi tín hiệu về cho sever ở một script nào đó, sau đó script đó có nhiệm vụ gửi dữ liệu lại cho khung!
cách làm: Ngay trong lời gọi khung ở client, trong file Xiulian.lua các bạn viết :
if ( event == "UI_COMMAND" and tonumber(arg0)==20150109 ) then
if(this:IsVisible()) then
this:Hide();
return;
end
Clear_XSCRIPT();
Set_XSCRIPT_Function_Name("ReturnAttrXiulian");
Set_XSCRIPT_ScriptID(390101);
Set_XSCRIPT_Parameter(0,1);
Set_XSCRIPT_ParamCount(1);
Send_XSCRIPT();
local selfUnionPos = Variable:GetVariable("SelfUnionPos");
if(selfUnionPos ~= nil) then
Xiulian_Frame:SetProperty("UnifiedPosition", selfUnionPos);
end
XIULIAN_BOOK_SELECT = 1;
XIULIAN_MIJI_SELECT = -1;
this:Show();
Xiulian_SetTabState()
end
sr every once!! dịp nghỉ phải được uống nhiều nên rất ít khi tỉnh!!
đoạn code trên mình sử dụng Xscript (bạn nên tìm hiểu về cái này kỹ hơn nếu chưa biết, mây topic gần đây rất hay nói về nó) gọi đến hàm "ReturnAttrXiulian" , hàm này đc khai báo trong một Script nào đó(các bạn tự tạo, ví dụ:Xiulian.lua) với ID là 390101. Hơn hết ,để Xscript hoạt động đc cần khai báo trong AllowableScriptFunc.txt trong sever. Điều quan trọng ở đây là trong Script Xiulian.lua mình sẽ dùng cấu trúc sau để gửi data đến Client:
BeginUICommand( sceneId )
UICommand_AddInt( sceneId, gongli )
.......
EndUICommand( sceneId )
DispatchUICommand( sceneId, selfId, 20150425)
Như vậy bên Client ở file Xiulian.lua trong hàm Xiulian_OnEvent(event) ta phải khai báo:
if ( event == "UI_COMMAND" and tonumber(arg0)==20150425 ) then
xiulian_gongli=Get_XParam_INT(0);
.....
Xiulian_Update();
Xiulian_JingJie_Selected_Update();
Xiulian_SetSelectState()
end
để nhận dữ liệu từ sever và có các khai báo các hàm để cập nhật hiển thị ngay trên khung!!
Nhân tiện nói về hàm :trong file lua ở client thì có những hàm mặc định và cách khai báo của nó (các bạn xem nhiều rồi sẽ quen vs cách thức khai báo của nó!).Những hàm mặc định này là gì , là những hàm mà game tự hiểu đc mà ko phải do vocker địn nghĩa (thì cũng là người nghĩ ra cả mà!) ví dụ như :_PreLoad() , _OnLoad(), _OnEvent(event) và bên cạnh đó không kém phần quan trọng là các hàm do moder or vocker khai báo,những hàm này có thể đc gọi bởi những hàm trong thân file lua và cũng có thể đc gọi từ file .xml. Điển hình nhất là khi tắt một khung giao diện, khi các bạn click chuột vào cái nút X ở cửa sổ , tức là bạn đã thực hiện hàm Close ở khung .xml đc gửi để file lua, hoặc xử lý ngay tại khung (nôm na thế thôi!!).
Như ta đã biết các file Xml là các khung giao diện , là các windows(các cửa sổ) , có thể hiểu là một đối tượng nhỏ đi!! Chúng thường có các kiểu, và tên.!! Có cửa sổ chỉ cho hiển thị ảnh mà ko cho click chuột vào, có của sổ chỉ để hiện chữ.... và cái kiểu WINDOWNS này HÌNH NHƯ đc quy định trong mấy file ở thư mục Schema, trong Interface.axp !!
Nói qua vậy thui, vào việc chính, việc vây giờ là các bạn cần hiển thị đc hình ảnh trong mấy cái ô nhỏ như mình đã làm, và thao tác click chuột trên mấy ô đó khả dụng!! Để làm đc điều đó , ta cần tìm đến vị trí của máy cái ô đó. Và trong si tiu ây sần này thì ô đầu tiên là ô "Xiulian_XinfaSkill_1 với câu trúc như sau:
<Window Type="TLBB_ActionButton" Name="Xiulian_XinfaSkill_1">
<Property Name="Position" Value="x:0.158046 y:0.040346"/>
<Property Name="AbsoluteSize" Value="w:34.000000 h:34.000000"/>
<Property Name="BackImage" Value="" />
<Event Name="Clicked" Function="Xiulian_Xinfa_Clicked(1);"/>
</Window>
Muốn hiển thị đc ảnh các bạn có thể khai báo <Property Name="BackImage" Value="" /> thành <Property Name="BackImage" Value="set:Xiulian1 image:Xiulian1_1" />, hoặc cho chuyên nghiệp hơn thì sẽ khai báo ở file lua với câu lệnh
XIULIAN_BOOKS[i]:SetProperty("BackImage",ImageXlBooks[i]) ở đây biến ImageXlBooks[i] của mình là cái "set:Xiulian1 image:Xiulian1_1". Lưu ý đổi với kiểu TLBB_ActionButton nó thường chỉ hiển thị ảnh đc với kiểu ảnh là "BackImage" mà hàm clcik chuột khả dụng!! Từ đó suy ngược lại xem cái hàm Xiulian_Xinfa_Clicked(1) nó nghĩa là gì !! Logic một tý và tính kiên trì một tý là có thể mod hệt như bản gốc!!
Đấy mới là xong phần hình ảnh! tiếp là phải hiện lên cái Tips cho nó, thế nó mới chuẩn như bản gốc được!! phần mod cái tip , mình xin chuyển sang một bài viết khác để hướng dẫn cụ thể hơn, vì nó dài và đòi hỏi một chút kỹ thuật!!
Hiện tại vì lý do công việc và bạn gái thì suốt ngày anh ơi nên khó tập trung đc !!mong anh em thông cảm !!