PDA

View Full Version : [JX] Hỏi về source JX Win - file KPlayer.cpp



traminh83
04-05-17, 07:44 PM
Nếu có thể mong các cao thủ dev source giải thích hay chỉ dẫn giùm (không phải dev script nha)

Mình đã hiểu được cách load một số file .lua khi start server.

Khi xem về file UiMarket (kỳ trân các) - mình search các biến các hàm thì thấy trong 2 file KPlayer có các dòng lệnh sau

File KPlayer.h


void script(int nId);


File KPlayer.cpp


#ifdef _SERVER
void KPlayer::script(int nId)
{
if (nId == 1)
{
char scriptName[255];
sprintf(scriptName,"\\script\\datau\\phanthuong\\exp.lua");
ExecuteScript(scriptName,"main",0);
}
else if (nId == 2)
{
char scriptName[255];
sprintf(scriptName,"\\script\\datau\\phanthuong\\money.lua");
ExecuteScript(scriptName,"main",0);
}

else if (nId == 3)
{
char scriptName[255];
sprintf(scriptName,"\\script\\datau\\phanthuong\\random.lua");
ExecuteScript(scriptName,"main",0);
}

else if (nId == 4)
{
char scriptName[255];
sprintf(scriptName,"\\script\\datau\\phanthuong\\lucky.lua");
ExecuteScript(scriptName,"main",0);
}

else if (nId == 5)
{
char scriptName[255];
sprintf(scriptName,"\\script\\datau\\phanthuong\\item.lua");
ExecuteScript(scriptName,"main",0);
}

else if (nId == 6)
{
char scriptName[255];
sprintf(scriptName,"\\script\\datau\\phanthuong\\point.lua");
ExecuteScript(scriptName,"main",0);
}
else if (nId == 7)
{
if(Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_FightMode == 0)
{
char scriptName[255];
sprintf(scriptName,"\\script\\ktc\\kytrancac.lua");
ExecuteScript(scriptName,"main",0);
}
else
{
char szMsg[100];
sprintf(szMsg, "Kh«ng thÓ më kú tr©n c¸c ë khu vùc chiÕn ®Êu.");
KPlayerChat::SendSystemInfo(1, m_nPlayerIndex, "HÖ thèng", (char *) szMsg, strlen(szMsg) );
}

}
else if (nId == 8)
{
char scriptName[255];
sprintf(scriptName,"\\script\\epdo\\ephkmp.lua");
ExecuteScript(scriptName,"main",0);
}
else if (nId == 9)
{
char scriptName[255];
sprintf(scriptName,"\\script\\trangthaipk\\luyencong.lua");
ExecuteScript(scriptName,"main",0);
}

else if (nId == 10)
{
char scriptName[255];
sprintf(scriptName,"\\script\\trangthaipk\\chiendau.lua");
ExecuteScript(scriptName,"main",0);
}

else if (nId == 11)
{
char scriptName[255];
sprintf(scriptName,"\\script\\trangthaipk\\dosat.lua");
ExecuteScript(scriptName,"main",0);
}

else if (nId == 12)
{
char scriptName[255];
sprintf(scriptName,"\\script\\system\\hethong.lua");
ExecuteScript(scriptName,"main",0);
}
else if (nId == 13)
{
char scriptName[255];
sprintf(scriptName,"\\script\\nhiemvu\\datau.lua");
ExecuteScript(scriptName,"main",0);
}

}
#endif


- mấy cái dòng #ifndef ... #endif thì mình hiểu những code trong đó dùng cho CoreServer.
- void script(int nId); => cái này thì gọi hàm.
- Nhưng qua file .cpp khi gọi hàm thì những dòng if (nId == 1) rồi else if (nId == 2) ...... trong những điều kiện có trong code - nếu thỏa mãn thì thực hiện chạy file .lua đã chỉ định sẵn.
- Do đang tìm cách hiểu cái UiMarket nó hoạt động thông qua source và script như thế nào (bình thường nó là 1 button - khi nhấn vào tất nhiên sẽ hiện một window (UI) nhỏ bán đồ gì đó - và cái việc bán đồ đó thông qua một file .lua để đưa vật phẩm lên UI - mình search trong thư mục script có file theo đường dẫn \\script\\ktc\\kytrancac.lua - trong file lua này là lệnh Sale(2) - theo mình hiểu là bán mấy cái đồ phúc duyên ... được qui định trong các file .txt - bình thường là 1 cái Ui Box để chứa các vật phẩm và khi mình thay đổi script theo dạng Say(....) gì đó - chạy game nó thay đổi Ui theo hàm Say)
- hiểu đến đây - nhưng vẫn chưa hiểu ngay chỗ mấy dòng lệnh if và else if - chính xác là mấy cái "nId"
- các file .lua luyencong, chiendau, ... hay datau (mình thấy trong các source khác) -
- đơn cử lấy datau làm ví dụ - thông thường mình click vào npc dã tẩu - sẽ hiện Ui dạng Say hay Say2 hay SayNew - và nó sẽ load script được viết tại file datau.lua còn khi click vào button trong game thì làm sao biết những nId này là của button hay chỉ là npc hoặc chỉ là một hàm trung gian để gọi script.
Những cái "nId" này ở đâu ra (mình thấy trong KPlayer.h có lệnh gọi) - và làm sao biết được nId nào là của các button luyencong, chiendau, item, lucky, datau, kytrancac...?
Có file nào qui định những nId đó không? Mình chỉ là tự mò mẫm rồi xem các bài viết, hướng dẫn của các ad, mod, và các jx developers trên clb. Mong các cao thủ chỉ dẫn giùm.

wermanhme1990
04-05-17, 07:55 PM
source này bạn dùng hình như không phải source gốc của tàu share mà source của team nào dev.
cái trên là khai báo và định nghĩa hàm, bạn sreach xem script(int nId) được gọi ở chổ nào, mình gà lắm nên chỉ biết vậy.

traminh83
04-05-17, 08:02 PM
source này bạn dùng hình như không phải source gốc của tàu share mà source của team nào dev.
cái trên là khai báo và định nghĩa hàm, bạn sreach xem script(int nId) được gọi ở chổ nào, mình gà lắm nên chỉ biết vậy.

Đúng rồi bạn, source này là source BrotherTeam7 - HTVL mình download theo link của một bạn trên diễn đàn.
Mình đã search rồi - search toàn bộ các file trong bộ source - nhưng chỉ thấy script(int nId) có trong 2 file là KPlayer.h và KPlayer.cpp thôi.

wermanhme1990
04-05-17, 08:05 PM
bạn sreach script( hoặc KPlayer::script thôi, vì nó có thể thay bằng script(xyz).

traminh83
04-05-17, 08:14 PM
Vẫn chỉ có trong file KPlayer.cpp - kiếm trong file này cũng chỉ có một chỗ mà mình đã post ở trên.

wermanhme1990
04-05-17, 08:52 PM
của bạn đây:
Core\Src\KProtocolProcess.cpp


void KProtocolProcess::NpcDaTauCommand(int nIndex, BYTE* pProtocol)
{
CP_DATAU *pDaTauCmd;

pDaTauCmd = (CP_DATAU *)pProtocol;
if (nIndex <= 0 || nIndex >= MAX_PLAYER)
return;

if (Player[nIndex].m_nIndex <= 0 || Player[nIndex].m_nIndex >= MAX_NPC)
return;

Player[nIndex].script(pDaTauCmd->nbutton);
}

traminh83
04-05-17, 09:19 PM
Mình hiểu được chút



int KUiDaTau::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
{
int nRet = 0;
switch(uMsg)
{
case WND_N_BUTTON_CLICK:
if (uParam == (unsigned int)(KWndWindow*)&EXP)
{
Hide();
g_pCoreShell->OperationRequest(GOI_DATAU, 1, 0);
}
else if (uParam == (unsigned int)(KWndWindow*)&money)
{
Hide();
g_pCoreShell->OperationRequest(GOI_DATAU, 2, 0);
}
else if (uParam == (unsigned int)(KWndWindow*)&random)
{
Hide();
g_pCoreShell->OperationRequest(GOI_DATAU, 3, 0);
}
break;
default:
nRet = KWndShowAnimate::WndProc(uMsg, uParam, nParam);
}
return nRet;
}


Trong UiDaTau có đoạn code trên,
cái chỗ g_pCoreShell->OperationRequest(GOI_DATAU, 1, 0);g_pCoreShell->OperationRequest(GOI_DATAU, 2, 0);g_pCoreShell->OperationRequest(GOI_DATAU, 3, 0);
tương ứng với exp, money, và random
mà 3 chữ này trong KPlayer.cpp ở trên mình post cũng có exp.lua, money.lua và random.lua.
- trong CoreShell.h có dòng GOI_DATAU khai báo trước,
- trong CoreShell.cpp



case GOI_DATAU:// Da Tau
SendClientDaTau(uParam);
break;


Hàm SendClientDaTau có trong KProtocol.cpp ở Core


void SendClientDaTau(int nstt)
{
CP_DATAU ButtonCmd;

ButtonCmd.ProtocolType = c2s_datau;
ButtonCmd.nbutton = nstt;
if (g_pClient)
g_pClient->SendPackToServer((BYTE*)&ButtonCmd, sizeof(CP_DATAU));
}


trong hàm này lại có CP_DATAU

Phía trên chút trong file KProtocol.cpp có khai báo


sizeof(CP_DATAU), // c2s_datau


vào trong file KProtocolProcess.cpp mà bạn mới post


void KProtocolProcess::NpcDaTauCommand(int nIndex, BYTE* pProtocol)
{
CP_DATAU *pDaTauCmd;

pDaTauCmd = (CP_DATAU *)pProtocol;
if (nIndex <= 0 || nIndex >= MAX_PLAYER)
return;

if (Player[nIndex].m_nIndex <= 0 || Player[nIndex].m_nIndex >= MAX_NPC)
return;

Player[nIndex].script(pDaTauCmd->nbutton);
}


Có CP_DATAU, và trong hàm này quy định nIndex >=0 và lớn hơn MAX_NPC và MAX_PLAYER

Cái dòng lệnh "script(pDaTauCmd->nbutton)" không biết có liên quan đến file UiDaTau trong cái đoạn mình post ở trên đầu



case WND_N_BUTTON_CLICK:
if (uParam == (unsigned int)(KWndWindow*)&EXP)
{
Hide();
g_pCoreShell->OperationRequest(GOI_DATAU, 1, 0);
}


Cái số 1 phía sau GOI_DATAU có phải là cái "nbutton" này không! và "nbutton" này chính là cái "nId" trong KPlayer.cpp.

- Theo mình hiểu thì phân tích ra vậy. Không biết đúng 100% không? Các hàm liên quan và kết nối với nhiều file, làm hơi bị rối.

traminh83
04-05-17, 09:29 PM
Mình tiếp tục search và kiểm tra trong UiMarket thử và kết quả cũng có GOI_DATAU



int KUiMiniMap::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
{
int nRet = 0;
switch(uMsg)
{
case WND_N_BUTTON_CLICK:
if (uParam == (unsigned int)(KWndWindow*)&m_SwitchBtn)
MapSetMode(s_eMapMode == MINIMAP_M_BRIEF_PIC ? MINIMAP_M_BRIEF_PIC_BROWSE : MINIMAP_M_BRIEF_PIC);
else if (uParam == (unsigned int)(KWndWindow*)&m_SwitchBtn)
MapSetMode(x_eMapMode == MINIMAP_M_BRIEF_PIC ? MINIMAP_M_BRIEF_PIC_BROWSE : MINIMAP_M_BRIEF_PIC);
else if (uParam == (unsigned int)(KWndWindow*)&m_WorldMapBtn)
MapSetMode(MINIMAP_M_WORLD_MAP);
else if (uParam == (unsigned int)(KWndWindow*)&m_BtnFlag)
KUiFindPos::OpenWindow();
else if (uParam == (unsigned int)(KWndWindow*)&m_CaveBtn)
MapSetMode(MINIMAP_M_CAVE_MAP);
else if (uParam == (unsigned int)(KWndWindow*)&m_MarketBtn)
if (g_pCoreShell->GetGameData(GDI_IS_CHEST_UNLOCKED, 0, 0))
{
g_pCoreShell->OperationRequest(GOI_DATAU, 7, 0);
break;
}
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, CN_GH, 0);
break;


Dòng lệnh


g_pCoreShell->OperationRequest(GOI_DATAU, 7, 0);


vẫn là GOI_DATAU, 7
và số 7 mình nghĩ nó cũng là nId trong file KPlayer.cpp

Có lẽ mình suy nghĩ đúng.

Thank wermanhme1990 nhiều lắm!

wermanhme1990
04-05-17, 09:35 PM
src jx cũ lắm rồi, đưa lên vs version cao như vs 2010 hoặc vs 2017 cũng khó, mình trước chỉ vọc chứ không dev.

traminh83
04-05-17, 10:37 PM
Thanks bạn lần nữa!
Thành quả có sự giúp đỡ của bạn:
Mình đã tạo button "Xaphu" và load file lua vào từ source.

<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>