LeHuyetVoHon
25-02-12, 03:26 PM
minhf thấy nhiều người phàn nàn việc có source jx rồi àm cũng không biết phát triển ra sao .hôm nay mình xin hướng dẫn sơ qua về cách vọc source mà mình biết các bạn có thể tham khảo
1.quy trình vận hành
+có 5 file chạy liên quan:paysys,,godess,bishop,s3relay,gameserver
+nó được khỏi động theo thứ tự trên
+khi 1 clietn kết nối đến sv nó sẽ kết nối đến port của paysys để ping sv và đăng nhập tk
+nếu đăng nhập đúng,thì paysys gửi 1 gói tin đến bishop để lấy thông tin về tài khoản:thông tin các nhân vật
+khi bạn chon 1 nv nó sẽ gửi về sv,và bishop dựa vào đó để truy nhập tới godess(datbase player) lấy dữ liệu và sau đó gửi dwux liệu player đến gamesv
+gamesv kiểm tra xem có thê tạo được player đó ko,nếu được thì sau đó player có thể vào game
+trong quá trình chơi game client và server trao đổi ở 3 dạng:1 là ping kết nối,2 là các packet chat,tong và 3 là các packet tương tác
2.dev source
+trong dev source ta chủ yếu quan tâm đến 2 phần đó là core và s3client.
+core ở đây là lõi game,điều khiển toàn bộ quá trình hoạt động của game,và clietn là tương tác giao diện đồ họa
+trong core được chia làm 2 loại là coreserrver và coreclient.khác nhau bởi đinh nghĩa _SERVER
#ifdef _SERVER là server
#ifndef _SERVER ko pahri sv là client
a.viết 1 packet game
+ví dụ viết 1 packet send 1 task của player từ sv đến client
-vào trong KProtocolProcess.h trong class KProtocolProcess tìm phần client,viết 1 hàm: void SV_SendTask(BYTE*nPacket);
-vào trong KProtocolDef.h tìm phần enum s2c_PROTOCOL và kếo đến cuối enum đó và trên đoạn s2c_extend = 250, khái báo 1 giao thức
s2c_sendtask,
-vào trong kprotocol.h viết 1 struct
typedef struct
{
BYTE nProtocolType;//giao thức
BYTE ntaskid;//idtask,với bản gốc thì max task là 256=1 byte
int ntaskvalue;//giá trị của task
}SVSENDTASK;
-vào trong kprotocol trogn phần protocolsize bạn tìm phần client kéo suống tìm 1 cái giao thức mà nó ở trên cái giao thức s2c_sendtask(xem trong kprotocoldef.h )và viết thêm vào 1 dòng :sizeof(SVSENDTASK),
ở đây có thêm 1 kiều giá trị nữa là -1(phần này để sau)
-vào trong KProtocolProcess.cpp tìm method KProtocolProcess::KProtocolProcess() tìm phần client và thêm đoạn này:
ProcessFunc[ s2c_sendtask] = &KProtocolProcess::SV_SendTask;//gán 1 con trỏ hàm
-tiếp tục giờ là đến công đoạn viết hàm
vì là truyền từ sv đến clietn nên hàm này sẽ được gọi từ client
#ifndef _SERVER
void KProtocolProcess::SV_SendTask(BYTE*nPacket)
{
SVSENDTASK *temp=(SVSENDTASK*)nPacket;
Player[CLIENT_PLAYER_INDEX].m_ctask.SetSaveVal(temp->ntaskid,temp->ntaskvalue);
}
#endif
-để truyền packet kia ta làm như sau;ở sv tại 1 hàm bất kì
void hambatky(idx,taskid,taskvalue)
{
SVSENDTASK temp;
temp.nProtocolType=s2c_sendtask;//giao thức là send task
temp.ntaskid=100;
temp.ntaskvalue=1000;
g_pServer.PackDataToClient(&temp,sizeof(SVSENDTASK));//packet đến client
}
+mình đã nói sơ qua về cách viết 1 packet cho game,phần sv thì các bạn làm ngược lại
-các bạn có thể tìm hiểu thêm để hiểu kỹ cách viết
b.cấu trúc item
+các thành phần liên quan:
-kitem chứa toàn bộ dữ liệu cảu item được tạo ra
-kitemgengerator:tạo ra 1 item
-còn 1 file load và chứa thông tin của item ở setting thì minh quên rồi,để lúc nào tìm lại
-kitemlist quản lý item của player
-itemset là class quản lý item chung
-KInventory là quản lý ô chưa như hànht rang....
-kbuysell là quản lý shop bán item
-kobj,kobjset là quản lý các item rơi dưới đất
+ở đây mình không hướng dẫn sâu về item mà chỉ đưa ra những cái cần thiết,còn lại các bạn cso thể tự tìm hiểu,vì hướng dẫn rất mất thời gian
+cách tạo trang bị hoàng kim,hay trang bị với 6 opmagic được quy định bởi setting
-vào trong cái file loaditem gì đó tìm hiểu cấu trúc load item ,và bạn tìm phần của itemequipment cho load thêm 20 cột(typeitem,groupitem,6 op(id,vamin,vamax))
-typeitem,biến này dùng để phân loại các loại đồ,bạn cso thể cho=1 là item hk
-group là phân loại các bộ item như ab,dq......
-đối với item hoàng kim cso op môn phái,do sv ko có những opid môn phái nên ta có thể làm mẹo dùng 1 mức phân định
trong server có khoảng 200 op,vạy ta sẽ lấy 500 là mốc,tính từ 501 trở đi là id của op skill
ví dụ skill baovulehoa có id=112,vậy nếu đồ hk môn phái dm muốn có skill này tâ khai bao 1 id là:500+112=612
-trong 2 method tạo item của class itemgengerator: gen_equipment và gen_exitsequipment kéo suống dứoi cùng dưới phần tạo op ta kt nếu là op hk thi gọi đến hàm createophk(),và trong hàm này bạn có thể randomop đơn giản với các tham số min max
-trong toán từ gán của class kitem bạn gán 6 op đó vào opattribmagic của class kitem
-cách hiển thị thông tin:
trong kitem::GetDesc: trong phần hiện tên item và op item bạn kiêm tra nếu là itemtrangbi và là item hk thì chỉnh màu hiện thị,muốn thếm màu mới cso thể vào file text.cpp trong engine
****kích hoạt item hoàng kim:
khi player trang bị item vào người tại hàm kitemlist::Equip
dưới cùng hàm đó bạn thêm 1 hàm mới là checkitemhk(idxitem)
có nhiều cách để check xem có đủ 1 bộ tiem để kích hoạt không
mìnnh xin nới sơ qua về 1 cách:
+tạo 1 mảng biến đếm số item cso trogn 1 nhóm,và 1 biến đếm số nhóm
+duyệt tất cả item được trang bị trên người,kiêm tra vị trí cso item và là item hk,co nhóm>0
+nếu item[i] thảo ãm điều kiện trên thì tiếp tục duyệt tất cả số nhóm đã có xem nó có trong nhóm nào,nếu cso thì tăng thêm số lượng item cho nhóm +đó,ngược lại thì ta cho nó vào 1 nhóm mới
+sau hki duyệt song,ta sẽ duỵet mảng nhóm đã có kiểm tra xem nhóm nào có tổng số item >=số item max của nhóm đó
+nếu có đủ 1 bộ thì thwucs hiện kích hoạt lại toàn bộ op ẩn của các item đăng trang bị trên người
+để có thế lấy được thông tin so tiem và loai tiem của mỗi nhóm bạn có thể làm trogn phần load item ở setting
****cách phục hồi trang bị bị mất do mất đồ,rollbackdata
+bạn có thể xem cách load item từ dữ liệu của nhận vật trong phần laod player trogn kplayerdbfuncs.cpp
+2 tham số cần để phục hồi là randomseed và luck
**** dài vãi,nói mãi không hết,nhảy qua vậy,để sau viết tiếp.
***cách khác phục hack mất nhân vật:
-chủ yếu là do dùng phần mềm nào đó để đổi tên của player lưa chọn để vào game,chống ở client là gần như vô dụng
-cách khả dĩ nhất là chống ở sv,cụ thể là ở bishop,bạn có thể tạo 1 danh sách các palyer xếp theo thứ tự giam dần theo level và phân theo kí tự tên để cho dễ truy suất,sau đó mã hóa tên thành 1 số bằng hàm băm thông qua cái g_filename2id
-khi client truyền dwux liệu paleyr đến bạn lọc lấy tên và mã hóa thành số rồi so sán với cái danh sách đã có.chỉ nên duyệt giới hạn ,vì duyệt nhiều quá làm nghẽn sv.
-cách kt nhanh hay chậm còn tùy thuộc vào trình độ code của bạn
-cách cảu mình cũng ko phải là tốt lắm
***vào liền lúc 1 nhân vật 2 lần.thường dựa vào lỗi này để bug dupe đồ
-cái này chủ yếu do máy chủ kém,nên xử lý hơi chậm,làm cho nó bug
-mình chưa nghĩ ra cách nào tốt tạm thời chỉ dùng cách duyệt lại toàn bộ mảng player có trong server,sau khi tìm thấy tk này rồit hì khóa nó lại
và dump đến vị trí cần làm tiếp,khi 1 cleitn gửi dữ liệu cùng lúc nó cũng duyệt đến đoạn này và lcus này nó sẽ kt tk này bị kháo chưa nếu khóa rồi thì return.vì bishop nó làm việc tuần tự
tạm thời đến đây,hơi oải tí đọc song đừng chém,có gì thì góp ý thôi
1.quy trình vận hành
+có 5 file chạy liên quan:paysys,,godess,bishop,s3relay,gameserver
+nó được khỏi động theo thứ tự trên
+khi 1 clietn kết nối đến sv nó sẽ kết nối đến port của paysys để ping sv và đăng nhập tk
+nếu đăng nhập đúng,thì paysys gửi 1 gói tin đến bishop để lấy thông tin về tài khoản:thông tin các nhân vật
+khi bạn chon 1 nv nó sẽ gửi về sv,và bishop dựa vào đó để truy nhập tới godess(datbase player) lấy dữ liệu và sau đó gửi dwux liệu player đến gamesv
+gamesv kiểm tra xem có thê tạo được player đó ko,nếu được thì sau đó player có thể vào game
+trong quá trình chơi game client và server trao đổi ở 3 dạng:1 là ping kết nối,2 là các packet chat,tong và 3 là các packet tương tác
2.dev source
+trong dev source ta chủ yếu quan tâm đến 2 phần đó là core và s3client.
+core ở đây là lõi game,điều khiển toàn bộ quá trình hoạt động của game,và clietn là tương tác giao diện đồ họa
+trong core được chia làm 2 loại là coreserrver và coreclient.khác nhau bởi đinh nghĩa _SERVER
#ifdef _SERVER là server
#ifndef _SERVER ko pahri sv là client
a.viết 1 packet game
+ví dụ viết 1 packet send 1 task của player từ sv đến client
-vào trong KProtocolProcess.h trong class KProtocolProcess tìm phần client,viết 1 hàm: void SV_SendTask(BYTE*nPacket);
-vào trong KProtocolDef.h tìm phần enum s2c_PROTOCOL và kếo đến cuối enum đó và trên đoạn s2c_extend = 250, khái báo 1 giao thức
s2c_sendtask,
-vào trong kprotocol.h viết 1 struct
typedef struct
{
BYTE nProtocolType;//giao thức
BYTE ntaskid;//idtask,với bản gốc thì max task là 256=1 byte
int ntaskvalue;//giá trị của task
}SVSENDTASK;
-vào trong kprotocol trogn phần protocolsize bạn tìm phần client kéo suống tìm 1 cái giao thức mà nó ở trên cái giao thức s2c_sendtask(xem trong kprotocoldef.h )và viết thêm vào 1 dòng :sizeof(SVSENDTASK),
ở đây có thêm 1 kiều giá trị nữa là -1(phần này để sau)
-vào trong KProtocolProcess.cpp tìm method KProtocolProcess::KProtocolProcess() tìm phần client và thêm đoạn này:
ProcessFunc[ s2c_sendtask] = &KProtocolProcess::SV_SendTask;//gán 1 con trỏ hàm
-tiếp tục giờ là đến công đoạn viết hàm
vì là truyền từ sv đến clietn nên hàm này sẽ được gọi từ client
#ifndef _SERVER
void KProtocolProcess::SV_SendTask(BYTE*nPacket)
{
SVSENDTASK *temp=(SVSENDTASK*)nPacket;
Player[CLIENT_PLAYER_INDEX].m_ctask.SetSaveVal(temp->ntaskid,temp->ntaskvalue);
}
#endif
-để truyền packet kia ta làm như sau;ở sv tại 1 hàm bất kì
void hambatky(idx,taskid,taskvalue)
{
SVSENDTASK temp;
temp.nProtocolType=s2c_sendtask;//giao thức là send task
temp.ntaskid=100;
temp.ntaskvalue=1000;
g_pServer.PackDataToClient(&temp,sizeof(SVSENDTASK));//packet đến client
}
+mình đã nói sơ qua về cách viết 1 packet cho game,phần sv thì các bạn làm ngược lại
-các bạn có thể tìm hiểu thêm để hiểu kỹ cách viết
b.cấu trúc item
+các thành phần liên quan:
-kitem chứa toàn bộ dữ liệu cảu item được tạo ra
-kitemgengerator:tạo ra 1 item
-còn 1 file load và chứa thông tin của item ở setting thì minh quên rồi,để lúc nào tìm lại
-kitemlist quản lý item của player
-itemset là class quản lý item chung
-KInventory là quản lý ô chưa như hànht rang....
-kbuysell là quản lý shop bán item
-kobj,kobjset là quản lý các item rơi dưới đất
+ở đây mình không hướng dẫn sâu về item mà chỉ đưa ra những cái cần thiết,còn lại các bạn cso thể tự tìm hiểu,vì hướng dẫn rất mất thời gian
+cách tạo trang bị hoàng kim,hay trang bị với 6 opmagic được quy định bởi setting
-vào trong cái file loaditem gì đó tìm hiểu cấu trúc load item ,và bạn tìm phần của itemequipment cho load thêm 20 cột(typeitem,groupitem,6 op(id,vamin,vamax))
-typeitem,biến này dùng để phân loại các loại đồ,bạn cso thể cho=1 là item hk
-group là phân loại các bộ item như ab,dq......
-đối với item hoàng kim cso op môn phái,do sv ko có những opid môn phái nên ta có thể làm mẹo dùng 1 mức phân định
trong server có khoảng 200 op,vạy ta sẽ lấy 500 là mốc,tính từ 501 trở đi là id của op skill
ví dụ skill baovulehoa có id=112,vậy nếu đồ hk môn phái dm muốn có skill này tâ khai bao 1 id là:500+112=612
-trong 2 method tạo item của class itemgengerator: gen_equipment và gen_exitsequipment kéo suống dứoi cùng dưới phần tạo op ta kt nếu là op hk thi gọi đến hàm createophk(),và trong hàm này bạn có thể randomop đơn giản với các tham số min max
-trong toán từ gán của class kitem bạn gán 6 op đó vào opattribmagic của class kitem
-cách hiển thị thông tin:
trong kitem::GetDesc: trong phần hiện tên item và op item bạn kiêm tra nếu là itemtrangbi và là item hk thì chỉnh màu hiện thị,muốn thếm màu mới cso thể vào file text.cpp trong engine
****kích hoạt item hoàng kim:
khi player trang bị item vào người tại hàm kitemlist::Equip
dưới cùng hàm đó bạn thêm 1 hàm mới là checkitemhk(idxitem)
có nhiều cách để check xem có đủ 1 bộ tiem để kích hoạt không
mìnnh xin nới sơ qua về 1 cách:
+tạo 1 mảng biến đếm số item cso trogn 1 nhóm,và 1 biến đếm số nhóm
+duyệt tất cả item được trang bị trên người,kiêm tra vị trí cso item và là item hk,co nhóm>0
+nếu item[i] thảo ãm điều kiện trên thì tiếp tục duyệt tất cả số nhóm đã có xem nó có trong nhóm nào,nếu cso thì tăng thêm số lượng item cho nhóm +đó,ngược lại thì ta cho nó vào 1 nhóm mới
+sau hki duyệt song,ta sẽ duỵet mảng nhóm đã có kiểm tra xem nhóm nào có tổng số item >=số item max của nhóm đó
+nếu có đủ 1 bộ thì thwucs hiện kích hoạt lại toàn bộ op ẩn của các item đăng trang bị trên người
+để có thế lấy được thông tin so tiem và loai tiem của mỗi nhóm bạn có thể làm trogn phần load item ở setting
****cách phục hồi trang bị bị mất do mất đồ,rollbackdata
+bạn có thể xem cách load item từ dữ liệu của nhận vật trong phần laod player trogn kplayerdbfuncs.cpp
+2 tham số cần để phục hồi là randomseed và luck
**** dài vãi,nói mãi không hết,nhảy qua vậy,để sau viết tiếp.
***cách khác phục hack mất nhân vật:
-chủ yếu là do dùng phần mềm nào đó để đổi tên của player lưa chọn để vào game,chống ở client là gần như vô dụng
-cách khả dĩ nhất là chống ở sv,cụ thể là ở bishop,bạn có thể tạo 1 danh sách các palyer xếp theo thứ tự giam dần theo level và phân theo kí tự tên để cho dễ truy suất,sau đó mã hóa tên thành 1 số bằng hàm băm thông qua cái g_filename2id
-khi client truyền dwux liệu paleyr đến bạn lọc lấy tên và mã hóa thành số rồi so sán với cái danh sách đã có.chỉ nên duyệt giới hạn ,vì duyệt nhiều quá làm nghẽn sv.
-cách kt nhanh hay chậm còn tùy thuộc vào trình độ code của bạn
-cách cảu mình cũng ko phải là tốt lắm
***vào liền lúc 1 nhân vật 2 lần.thường dựa vào lỗi này để bug dupe đồ
-cái này chủ yếu do máy chủ kém,nên xử lý hơi chậm,làm cho nó bug
-mình chưa nghĩ ra cách nào tốt tạm thời chỉ dùng cách duyệt lại toàn bộ mảng player có trong server,sau khi tìm thấy tk này rồit hì khóa nó lại
và dump đến vị trí cần làm tiếp,khi 1 cleitn gửi dữ liệu cùng lúc nó cũng duyệt đến đoạn này và lcus này nó sẽ kt tk này bị kháo chưa nếu khóa rồi thì return.vì bishop nó làm việc tuần tự
tạm thời đến đây,hơi oải tí đọc song đừng chém,có gì thì góp ý thôi