lzlsky301
30-09-12, 04:42 AM
Hôm nay mình sẽ hướng dẫn các bạn làm hiện tên Obj dưới đất mà ko cần rà chuột + phân biệt màu chuẩn VNG :D.
Đầu tiên các bạn vào S3Client:
Tại ShortcutKey.cpp:
các bạn tìm showplayernumber, thêm vào sau nó "showobjname",
char* l_StatusList[] =
{
"run", //0 Åܲ½
"sit", //1 ´ò×ø
"trade", //2 ½»Ò×
"pk", //3 PK
"horse", //4 Âí
"showplayername", //5 ÏÔʾÍæ¼ÒÃû×Ö
"showplayerlife", //6 ÏÔʾÍæ¼ÒÉúÃü
"showplayermana", //7 ÏÔʾÍæ¼ÒÄÚÁ¦
"showplayernumber", //8 ½çÃæÏÔʾÍæ¼ÒÊý×Ö
"showobjname", //9 hien ten obj duoi dat
};
Sau đó tại
int LuaSwitchStatus(Lua_State * L)
{
if (Lua_GetTopIndex(L) != 1)
return 0;
char * strStatus = (char *)Lua_ValueToString(L, 1);
if (strStatus)
{
switch(FindStatus(strStatus))
{
case 0: //Åܲ½
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_RUN, 0);
break;
case 1: //´ò×ø
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_SIT, 0);
break;
case 2: //½»Ò×
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_TRADE_WILLING, 0, true);
break;
case 3: //PK
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0,
!g_pCoreShell->GetGameData(GDI_PK_SETTING, 0, 0));
}
break;
case 4: //Âí
//if (g_pCoreShell)
// g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0, Player_PK::ms_bPK);
break;
case 5: //ÏÔʾÍæ¼ÒÃû×Ö
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_NAME, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_NAME, 0, 0));
}
break;
case 6: //ÏÔʾÍæ¼ÒÉúÃü
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_LIFE, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_LIFE, 0, 0));
}
break;
case 7: //ÏÔʾÍæ¼ÒÄÚÁ¦
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_MANA, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_MANA, 0, 0));
}
break;
case 8: //½çÃæÏÔʾÍæ¼ÒÊý×Ö
Player_Life::m_bText = !Player_Life::m_bText;
Player_Mana::m_bText = !Player_Mana::m_bText;
Player_Stamina::m_bText = !Player_Stamina::m_bText;
Player_Exp::m_bText = !Player_Exp::m_bText;
break;
case 9:
KUiPlayerBar::SwitchChannel();
break;
}
}
return 0;
}
Sửa thành:
int LuaSwitchStatus(Lua_State * L)
{
if (Lua_GetTopIndex(L) != 1)
return 0;
char * strStatus = (char *)Lua_ValueToString(L, 1);
if (strStatus)
{
switch(FindStatus(strStatus))
{
case 0: //Åܲ½
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_RUN, 0);
break;
case 1: //´ò×ø
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_SIT, 0);
break;
case 2: //½»Ò×
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_TRADE_WILLING, 0, true);
break;
case 3: //PK
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0,
!g_pCoreShell->GetGameData(GDI_PK_SETTING, 0, 0));
}
break;
case 4: //Âí
//if (g_pCoreShell)
// g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0, Player_PK::ms_bPK);
break;
case 5: //ÏÔʾÍæ¼ÒÃû×Ö
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_NAME, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_NAME, 0, 0));
}
break;
case 6: //ÏÔʾÍæ¼ÒÉúÃü
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_LIFE, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_LIFE, 0, 0));
}
break;
case 7: //ÏÔʾÍæ¼ÒÄÚÁ¦
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_MANA, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_MANA, 0, 0));
}
break;
case 8: //½çÃæÏÔʾÍæ¼ÒÊý×Ö
Player_Life::m_bText = !Player_Life::m_bText;
Player_Mana::m_bText = !Player_Mana::m_bText;
Player_Stamina::m_bText = !Player_Stamina::m_bText;
Player_Exp::m_bText = !Player_Exp::m_bText;
break;
case 9: //ÏÔʾÍæ¼ÒÉúÃü
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_OBJ_NAME, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_OBJ_NAME, 0, 0));// hien ten obj duoi dat
}
break;
case 10:
KUiPlayerBar::SwitchChannel();
break;
}
}
return 0;
}
Tại ShortcutKey.h các bạn tìm:
#define SCK_SHORTCUT_SHOWPLAYERNUMBER "Switch([[showplayernumber]])"
Khai báo tiếp sau nó là:
#define SCK_SHORTCUT_SHOWOBJNAME "Switch([[showobjname]])"
Hì thế là xong phần S3Client.
Tiếp theo ta qua Core:
Tại CoreShell.cpp
Các bạn khai báo thêm thư viện cho nó là #include "KObjSet.h"
Ta Tìm:
case GDI_SHOW_PLAYERS_MANA: //»ñÈ¡ÏÔʾ¸÷Íæ¼ÒÄÚÁ¦
nRet = NpcSet.CheckShowMana();
break;
Thêm vào sau nó
case GDI_SHOW_OBJ_NAME: //hien tên obj
nRet = ObjSet.CheckShowName();
break;
Tiếp theo tìm đến
case GOI_SHOW_PLAYERS_MANA:
NpcSet.SetShowManaFlag(nParam);
break;
Thêm vào sau nó:
case GOI_SHOW_OBJ_NAME:
ObjSet.SetShowNameFlag(nParam); // hien ten obj duoi dat
break;
Sau đó ta vào CoreShell.h
Tìm đến GOI_QUERY_RANK_INFORMATION,
Thêm vào tiếp sau nó là GOI_SHOW_OBJ_NAME, // hien ten obj duoi dat
Tìm đến GDI_IMMEDIATEITEM_NUM,
Thêm vào tiếp sau nó là GDI_SHOW_OBJ_NAME, // HIEN TEN OBJ DUOI DAT
Thế là xong phần Core:
Tiếp theo ta vào KObjSet.cpp
Tìm Đến
int KObjSet::Add(int nDataID, KMapPos MapPos, KObjItemInfo sItemInfo)
{
if (sItemInfo.m_nItemID > 0)
{
g_DebugLog("[ITEM]Object ItemIndex:%d, ID:%d", sItemInfo.m_nItemID, Item[sItemInfo.m_nItemID].GetID());
}
int nAddNo;
nAddNo = AddData(nDataID, MapPos, sItemInfo.m_nMoneyNum, sItemInfo.m_nItemID, sItemInfo.m_nItemWidth, sItemInfo.m_nItemHeight);
if (nAddNo < 0)
return -1;
Object[nAddNo].SetWorldID(GetID());
Object[nAddNo].m_nColorID = sItemInfo.m_nColorID;
if (sItemInfo.m_szName[0] && strlen(sItemInfo.m_szName) < 32)
strcpy(Object[nAddNo].m_szName, sItemInfo.m_szName);
OBJ_ADD_SYNC cObjAdd;
int i, nTempX, nTempY;
cObjAdd.ProtocolType = (BYTE)s2c_objadd;
cObjAdd.m_nID = Object[nAddNo].m_nID;
cObjAdd.m_nDataID = Object[nAddNo].m_nDataID;
cObjAdd.m_btDir = Object[nAddNo].m_nDir;
cObjAdd.m_wCurFrame = Object[nAddNo].m_cImage.m_nCurFrame;
cObjAdd.m_btState = Object[nAddNo].m_nState;
SubWorld[MapPos.nSubWorld].Map2Mps(MapPos.nRegion, MapPos.nMapX, MapPos.nMapY, MapPos.nOffX, MapPos.nOffY, &nTempX, &nTempY);
cObjAdd.m_nXpos = nTempX;
cObjAdd.m_nYpos = nTempY;
cObjAdd.m_nMoneyNum = sItemInfo.m_nMoneyNum;
cObjAdd.m_nItemID = sItemInfo.m_nItemID;
cObjAdd.m_btItemWidth = sItemInfo.m_nItemWidth;
cObjAdd.m_btItemHeight = sItemInfo.m_nItemHeight;
cObjAdd.m_btColorID = sItemInfo.m_nColorID;
cObjAdd.m_btFlag = 0;
if (sItemInfo.m_nSoundFlag)
cObjAdd.m_btFlag |= 0x01;
if (sItemInfo.m_nMovieFlag)
cObjAdd.m_btFlag |= 0x02;
strcpy(cObjAdd.m_szName, Object[nAddNo].m_szName);
cObjAdd.m_wLength = sizeof(OBJ_ADD_SYNC) - 1 - sizeof(cObjAdd.m_szName) + strlen(cObjAdd.m_szName);
POINT POff[8] =
{
{0, 32},
{-16, 32},
{-16, 0},
{-16, -32},
{0, -32},
{16, -32},
{16, 0},
{16, 32},
};
int nMaxCount = MAX_BROADCAST_COUNT;
SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].BroadCast((BYTE*)&cObjAdd, cObjAdd.m_wLength + 1, nMaxCount, Object[nAddNo].m_nMapX, Object[nAddNo].m_nMapY);
int nConRegion;
for (i = 0; i < 8; i++)
{
nConRegion = SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].m_nConnectRegion[i];
if (nConRegion == -1)
continue;
SubWorld[MapPos.nSubWorld].m_Region[nConRegion].BroadCast((BYTE*)&cObjAdd, cObjAdd.m_wLength + 1, nMaxCount, Object[nAddNo].m_nMapX - POff[i].x, Object[nAddNo].m_nMapY - POff[i].y);
}
SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].AddObj(nAddNo);// m_WorldMessage.Send(GWM_OBJ_ADD, MapPos.nRegion, nAddNo);
return nAddNo;
}
Sửa thành, với biến màu đỏ là biến phân loại item hoàng kim hoặc tím, các bạn edit cho phù hợp vs source của các bạn:
int KObjSet::Add(int nDataID, KMapPos MapPos, KObjItemInfo sItemInfo)
{
if (sItemInfo.m_nItemID > 0)
{
g_DebugLog("[ITEM]Object ItemIndex:%d, ID:%d", sItemInfo.m_nItemID, Item[sItemInfo.m_nItemID].GetID());
}
int nAddNo;
nAddNo = AddData(nDataID, MapPos, sItemInfo.m_nMoneyNum, sItemInfo.m_nItemID, sItemInfo.m_nItemWidth, sItemInfo.m_nItemHeight);
if (nAddNo < 0)
return -1;
Object[nAddNo].SetWorldID(GetID());
if(Object[nAddNo].m_nKind == Obj_Kind_Item) // This is an item
{
if (Item[sItemInfo.m_nItemID].GetGenre() == 0) // this is equip item
if (Item[sItemInfo.m_nItemID].m_CommonAttrib.nTypeItem == 1) // hien thi mau item tim
sItemInfo.m_nColorID = 3;
else if (Item[sItemInfo.m_nItemID].m_CommonAttrib.nTypeItem > 1) // hien thi mau item hk
sItemInfo.m_nColorID = 2;
else if (Item[sItemInfo.m_nItemID].m_aryMagicAttrib[0].nAttribType) // hien thi mau item xanh
sItemInfo.m_nColorID = 1;
else
sItemInfo.m_nColorID = 0; // mau item trang
else
sItemInfo.m_nColorID = 0;
Object[nAddNo].m_nColorID = sItemInfo.m_nColorID;
}
else // Not in item - White name
sItemInfo.m_nColorID = 0;
if (sItemInfo.m_szName[0] && strlen(sItemInfo.m_szName) < 32)
strcpy(Object[nAddNo].m_szName, sItemInfo.m_szName);
OBJ_ADD_SYNC cObjAdd;
int i, nTempX, nTempY;
cObjAdd.ProtocolType = (BYTE)s2c_objadd;
cObjAdd.m_nID = Object[nAddNo].m_nID;
cObjAdd.m_nDataID = Object[nAddNo].m_nDataID;
cObjAdd.m_btDir = Object[nAddNo].m_nDir;
cObjAdd.m_wCurFrame = Object[nAddNo].m_cImage.m_nCurFrame;
cObjAdd.m_btState = Object[nAddNo].m_nState;
SubWorld[MapPos.nSubWorld].Map2Mps(MapPos.nRegion, MapPos.nMapX, MapPos.nMapY, MapPos.nOffX, MapPos.nOffY, &nTempX, &nTempY);
cObjAdd.m_nXpos = nTempX;
cObjAdd.m_nYpos = nTempY;
cObjAdd.m_nMoneyNum = sItemInfo.m_nMoneyNum;
cObjAdd.m_nItemID = sItemInfo.m_nItemID;
cObjAdd.m_btItemWidth = sItemInfo.m_nItemWidth;
cObjAdd.m_btItemHeight = sItemInfo.m_nItemHeight;
cObjAdd.m_btColorID = sItemInfo.m_nColorID;
cObjAdd.m_btFlag = 0;
if (sItemInfo.m_nSoundFlag)
cObjAdd.m_btFlag |= 0x01;
if (sItemInfo.m_nMovieFlag)
cObjAdd.m_btFlag |= 0x02;
strcpy(cObjAdd.m_szName, Object[nAddNo].m_szName);
cObjAdd.m_wLength = sizeof(OBJ_ADD_SYNC) - 1 - sizeof(cObjAdd.m_szName) + strlen(cObjAdd.m_szName);
POINT POff[8] =
{
{0, 32},
{-16, 32},
{-16, 0},
{-16, -32},
{0, -32},
{16, -32},
{16, 0},
{16, 32},
};
int nMaxCount = MAX_BROADCAST_COUNT;
SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].BroadCast((BYTE*)&cObjAdd, cObjAdd.m_wLength + 1, nMaxCount, Object[nAddNo].m_nMapX, Object[nAddNo].m_nMapY);
int nConRegion;
for (i = 0; i < 8; i++)
{
nConRegion = SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].m_nConnectRegion[i];
if (nConRegion == -1)
continue;
SubWorld[MapPos.nSubWorld].m_Region[nConRegion].BroadCast((BYTE*)&cObjAdd, cObjAdd.m_wLength + 1, nMaxCount, Object[nAddNo].m_nMapX - POff[i].x, Object[nAddNo].m_nMapY - POff[i].y);
}
SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].AddObj(nAddNo);// m_WorldMessage.Send(GWM_OBJ_ADD, MapPos.nRegion, nAddNo);
return nAddNo;
}
Vào KItem.h tìm KItemCommonAttrib m_CommonAttrib; trên nó có dòng private các bạn sửa thành public ^^
Build và đưa vào server và client. Thế là xong phần build ^^
Cuối cùng các bạn vào client, vào folder Ui tìm đến 2 file có đuôi mở rộng là .lua
Thêm
AddCommand("Alt+Space", "","Switch([[showobjname]])")
sau một hàm AddCommand bất kỳ.
Sau đó chạy server, chạy game và vào phần tùy chọn, chỉnh qua lại giữa chế độ bàn phím mặc định và kết hợp để client load các file lua. vào game vứt vật phẩm ra và ấn Alt+Space.
VỚI ĐIỀU KIỆN LÀ CÁC BẠN CHƯA LÀM HIỆN TÊN OBJ NHƯ CBT HƯỚNG DẪN ^^
Bổ sung phần hiện tiền vạn lượng ^^
Tại KObj.cpp
Các bạn tìm
void KObj::DrawInfo()
{
// return;
if (m_nKind != Obj_Kind_Item)// && m_nKind != Obj_Kind_Money)
return;
int nMpsX, nMpsY, nHeightOff;
DWORD dwColor;
GetMpsPos(&nMpsX, &nMpsY);
nHeightOff = OBJ_SHOW_NAME_Y_OFF;
dwColor = this->m_dwNameColor;
g_pRepresent->OutputText(12, m_szName, KRF_ZERO_END, nMpsX - 12 * g_StrLen(m_szName) / 4, nMpsY, dwColor, 0, nHeightOff);
}
Sửa thành
void KObj::DrawInfo()
{
// return;
if (m_nKind != Obj_Kind_Item && m_nKind != Obj_Kind_Money)
return;
int nMpsX, nMpsY, nHeightOff;
DWORD dwColor;
if (m_nKind == Obj_Kind_Money)
{
char szMoney[64];
char szvMoney[128];
char szlMoney[128];
int m_nvMoneyNum = m_nMoneyNum / 10000;
int m_nlMoneyNum = m_nMoneyNum % 10000;
sprintf(szMoney,"%d l*îng",m_nMoneyNum);
sprintf(szvMoney,"%d v¹n l*îng",m_nvMoneyNum);
sprintf(szlMoney,"%d v¹n %d l*îng",m_nvMoneyNum, m_nlMoneyNum);
GetMpsPos(&nMpsX, &nMpsY);
nHeightOff = OBJ_SHOW_NAME_Y_OFF;
dwColor = 255 << 16 | 217 << 8 | 78;
if (m_nMoneyNum < 10000)
g_pRepresent->OutputText(12, szMoney, KRF_ZERO_END, nMpsX - 12 * g_StrLen(szMoney) / 4, nMpsY, dwColor, 0, nHeightOff);
else if (m_nlMoneyNum == 0)
g_pRepresent->OutputText(12, szvMoney, KRF_ZERO_END, nMpsX - 12 * g_StrLen(szvMoney) / 4, nMpsY, dwColor, 0, nHeightOff);
else
g_pRepresent->OutputText(12, szlMoney, KRF_ZERO_END, nMpsX - 12 * g_StrLen(szlMoney) / 4, nMpsY, dwColor, 0, nHeightOff);
}
else
{
GetMpsPos(&nMpsX, &nMpsY);
nHeightOff = OBJ_SHOW_NAME_Y_OFF;
dwColor = this->m_dwNameColor;
g_pRepresent->OutputText(12, m_szName, KRF_ZERO_END, nMpsX - 12 * g_StrLen(m_szName) / 4, nMpsY, dwColor, 0, nHeightOff);
}}
Đầu tiên các bạn vào S3Client:
Tại ShortcutKey.cpp:
các bạn tìm showplayernumber, thêm vào sau nó "showobjname",
char* l_StatusList[] =
{
"run", //0 Åܲ½
"sit", //1 ´ò×ø
"trade", //2 ½»Ò×
"pk", //3 PK
"horse", //4 Âí
"showplayername", //5 ÏÔʾÍæ¼ÒÃû×Ö
"showplayerlife", //6 ÏÔʾÍæ¼ÒÉúÃü
"showplayermana", //7 ÏÔʾÍæ¼ÒÄÚÁ¦
"showplayernumber", //8 ½çÃæÏÔʾÍæ¼ÒÊý×Ö
"showobjname", //9 hien ten obj duoi dat
};
Sau đó tại
int LuaSwitchStatus(Lua_State * L)
{
if (Lua_GetTopIndex(L) != 1)
return 0;
char * strStatus = (char *)Lua_ValueToString(L, 1);
if (strStatus)
{
switch(FindStatus(strStatus))
{
case 0: //Åܲ½
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_RUN, 0);
break;
case 1: //´ò×ø
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_SIT, 0);
break;
case 2: //½»Ò×
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_TRADE_WILLING, 0, true);
break;
case 3: //PK
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0,
!g_pCoreShell->GetGameData(GDI_PK_SETTING, 0, 0));
}
break;
case 4: //Âí
//if (g_pCoreShell)
// g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0, Player_PK::ms_bPK);
break;
case 5: //ÏÔʾÍæ¼ÒÃû×Ö
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_NAME, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_NAME, 0, 0));
}
break;
case 6: //ÏÔʾÍæ¼ÒÉúÃü
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_LIFE, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_LIFE, 0, 0));
}
break;
case 7: //ÏÔʾÍæ¼ÒÄÚÁ¦
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_MANA, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_MANA, 0, 0));
}
break;
case 8: //½çÃæÏÔʾÍæ¼ÒÊý×Ö
Player_Life::m_bText = !Player_Life::m_bText;
Player_Mana::m_bText = !Player_Mana::m_bText;
Player_Stamina::m_bText = !Player_Stamina::m_bText;
Player_Exp::m_bText = !Player_Exp::m_bText;
break;
case 9:
KUiPlayerBar::SwitchChannel();
break;
}
}
return 0;
}
Sửa thành:
int LuaSwitchStatus(Lua_State * L)
{
if (Lua_GetTopIndex(L) != 1)
return 0;
char * strStatus = (char *)Lua_ValueToString(L, 1);
if (strStatus)
{
switch(FindStatus(strStatus))
{
case 0: //Åܲ½
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_RUN, 0);
break;
case 1: //´ò×ø
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_SIT, 0);
break;
case 2: //½»Ò×
if (g_pCoreShell)
g_pCoreShell->OperationRequest(GOI_TRADE_WILLING, 0, true);
break;
case 3: //PK
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0,
!g_pCoreShell->GetGameData(GDI_PK_SETTING, 0, 0));
}
break;
case 4: //Âí
//if (g_pCoreShell)
// g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0, Player_PK::ms_bPK);
break;
case 5: //ÏÔʾÍæ¼ÒÃû×Ö
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_NAME, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_NAME, 0, 0));
}
break;
case 6: //ÏÔʾÍæ¼ÒÉúÃü
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_LIFE, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_LIFE, 0, 0));
}
break;
case 7: //ÏÔʾÍæ¼ÒÄÚÁ¦
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_MANA, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_MANA, 0, 0));
}
break;
case 8: //½çÃæÏÔʾÍæ¼ÒÊý×Ö
Player_Life::m_bText = !Player_Life::m_bText;
Player_Mana::m_bText = !Player_Mana::m_bText;
Player_Stamina::m_bText = !Player_Stamina::m_bText;
Player_Exp::m_bText = !Player_Exp::m_bText;
break;
case 9: //ÏÔʾÍæ¼ÒÉúÃü
if (g_pCoreShell)
{
g_pCoreShell->OperationRequest(GOI_SHOW_OBJ_NAME, 0,
!g_pCoreShell->GetGameData(GDI_SHOW_OBJ_NAME, 0, 0));// hien ten obj duoi dat
}
break;
case 10:
KUiPlayerBar::SwitchChannel();
break;
}
}
return 0;
}
Tại ShortcutKey.h các bạn tìm:
#define SCK_SHORTCUT_SHOWPLAYERNUMBER "Switch([[showplayernumber]])"
Khai báo tiếp sau nó là:
#define SCK_SHORTCUT_SHOWOBJNAME "Switch([[showobjname]])"
Hì thế là xong phần S3Client.
Tiếp theo ta qua Core:
Tại CoreShell.cpp
Các bạn khai báo thêm thư viện cho nó là #include "KObjSet.h"
Ta Tìm:
case GDI_SHOW_PLAYERS_MANA: //»ñÈ¡ÏÔʾ¸÷Íæ¼ÒÄÚÁ¦
nRet = NpcSet.CheckShowMana();
break;
Thêm vào sau nó
case GDI_SHOW_OBJ_NAME: //hien tên obj
nRet = ObjSet.CheckShowName();
break;
Tiếp theo tìm đến
case GOI_SHOW_PLAYERS_MANA:
NpcSet.SetShowManaFlag(nParam);
break;
Thêm vào sau nó:
case GOI_SHOW_OBJ_NAME:
ObjSet.SetShowNameFlag(nParam); // hien ten obj duoi dat
break;
Sau đó ta vào CoreShell.h
Tìm đến GOI_QUERY_RANK_INFORMATION,
Thêm vào tiếp sau nó là GOI_SHOW_OBJ_NAME, // hien ten obj duoi dat
Tìm đến GDI_IMMEDIATEITEM_NUM,
Thêm vào tiếp sau nó là GDI_SHOW_OBJ_NAME, // HIEN TEN OBJ DUOI DAT
Thế là xong phần Core:
Tiếp theo ta vào KObjSet.cpp
Tìm Đến
int KObjSet::Add(int nDataID, KMapPos MapPos, KObjItemInfo sItemInfo)
{
if (sItemInfo.m_nItemID > 0)
{
g_DebugLog("[ITEM]Object ItemIndex:%d, ID:%d", sItemInfo.m_nItemID, Item[sItemInfo.m_nItemID].GetID());
}
int nAddNo;
nAddNo = AddData(nDataID, MapPos, sItemInfo.m_nMoneyNum, sItemInfo.m_nItemID, sItemInfo.m_nItemWidth, sItemInfo.m_nItemHeight);
if (nAddNo < 0)
return -1;
Object[nAddNo].SetWorldID(GetID());
Object[nAddNo].m_nColorID = sItemInfo.m_nColorID;
if (sItemInfo.m_szName[0] && strlen(sItemInfo.m_szName) < 32)
strcpy(Object[nAddNo].m_szName, sItemInfo.m_szName);
OBJ_ADD_SYNC cObjAdd;
int i, nTempX, nTempY;
cObjAdd.ProtocolType = (BYTE)s2c_objadd;
cObjAdd.m_nID = Object[nAddNo].m_nID;
cObjAdd.m_nDataID = Object[nAddNo].m_nDataID;
cObjAdd.m_btDir = Object[nAddNo].m_nDir;
cObjAdd.m_wCurFrame = Object[nAddNo].m_cImage.m_nCurFrame;
cObjAdd.m_btState = Object[nAddNo].m_nState;
SubWorld[MapPos.nSubWorld].Map2Mps(MapPos.nRegion, MapPos.nMapX, MapPos.nMapY, MapPos.nOffX, MapPos.nOffY, &nTempX, &nTempY);
cObjAdd.m_nXpos = nTempX;
cObjAdd.m_nYpos = nTempY;
cObjAdd.m_nMoneyNum = sItemInfo.m_nMoneyNum;
cObjAdd.m_nItemID = sItemInfo.m_nItemID;
cObjAdd.m_btItemWidth = sItemInfo.m_nItemWidth;
cObjAdd.m_btItemHeight = sItemInfo.m_nItemHeight;
cObjAdd.m_btColorID = sItemInfo.m_nColorID;
cObjAdd.m_btFlag = 0;
if (sItemInfo.m_nSoundFlag)
cObjAdd.m_btFlag |= 0x01;
if (sItemInfo.m_nMovieFlag)
cObjAdd.m_btFlag |= 0x02;
strcpy(cObjAdd.m_szName, Object[nAddNo].m_szName);
cObjAdd.m_wLength = sizeof(OBJ_ADD_SYNC) - 1 - sizeof(cObjAdd.m_szName) + strlen(cObjAdd.m_szName);
POINT POff[8] =
{
{0, 32},
{-16, 32},
{-16, 0},
{-16, -32},
{0, -32},
{16, -32},
{16, 0},
{16, 32},
};
int nMaxCount = MAX_BROADCAST_COUNT;
SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].BroadCast((BYTE*)&cObjAdd, cObjAdd.m_wLength + 1, nMaxCount, Object[nAddNo].m_nMapX, Object[nAddNo].m_nMapY);
int nConRegion;
for (i = 0; i < 8; i++)
{
nConRegion = SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].m_nConnectRegion[i];
if (nConRegion == -1)
continue;
SubWorld[MapPos.nSubWorld].m_Region[nConRegion].BroadCast((BYTE*)&cObjAdd, cObjAdd.m_wLength + 1, nMaxCount, Object[nAddNo].m_nMapX - POff[i].x, Object[nAddNo].m_nMapY - POff[i].y);
}
SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].AddObj(nAddNo);// m_WorldMessage.Send(GWM_OBJ_ADD, MapPos.nRegion, nAddNo);
return nAddNo;
}
Sửa thành, với biến màu đỏ là biến phân loại item hoàng kim hoặc tím, các bạn edit cho phù hợp vs source của các bạn:
int KObjSet::Add(int nDataID, KMapPos MapPos, KObjItemInfo sItemInfo)
{
if (sItemInfo.m_nItemID > 0)
{
g_DebugLog("[ITEM]Object ItemIndex:%d, ID:%d", sItemInfo.m_nItemID, Item[sItemInfo.m_nItemID].GetID());
}
int nAddNo;
nAddNo = AddData(nDataID, MapPos, sItemInfo.m_nMoneyNum, sItemInfo.m_nItemID, sItemInfo.m_nItemWidth, sItemInfo.m_nItemHeight);
if (nAddNo < 0)
return -1;
Object[nAddNo].SetWorldID(GetID());
if(Object[nAddNo].m_nKind == Obj_Kind_Item) // This is an item
{
if (Item[sItemInfo.m_nItemID].GetGenre() == 0) // this is equip item
if (Item[sItemInfo.m_nItemID].m_CommonAttrib.nTypeItem == 1) // hien thi mau item tim
sItemInfo.m_nColorID = 3;
else if (Item[sItemInfo.m_nItemID].m_CommonAttrib.nTypeItem > 1) // hien thi mau item hk
sItemInfo.m_nColorID = 2;
else if (Item[sItemInfo.m_nItemID].m_aryMagicAttrib[0].nAttribType) // hien thi mau item xanh
sItemInfo.m_nColorID = 1;
else
sItemInfo.m_nColorID = 0; // mau item trang
else
sItemInfo.m_nColorID = 0;
Object[nAddNo].m_nColorID = sItemInfo.m_nColorID;
}
else // Not in item - White name
sItemInfo.m_nColorID = 0;
if (sItemInfo.m_szName[0] && strlen(sItemInfo.m_szName) < 32)
strcpy(Object[nAddNo].m_szName, sItemInfo.m_szName);
OBJ_ADD_SYNC cObjAdd;
int i, nTempX, nTempY;
cObjAdd.ProtocolType = (BYTE)s2c_objadd;
cObjAdd.m_nID = Object[nAddNo].m_nID;
cObjAdd.m_nDataID = Object[nAddNo].m_nDataID;
cObjAdd.m_btDir = Object[nAddNo].m_nDir;
cObjAdd.m_wCurFrame = Object[nAddNo].m_cImage.m_nCurFrame;
cObjAdd.m_btState = Object[nAddNo].m_nState;
SubWorld[MapPos.nSubWorld].Map2Mps(MapPos.nRegion, MapPos.nMapX, MapPos.nMapY, MapPos.nOffX, MapPos.nOffY, &nTempX, &nTempY);
cObjAdd.m_nXpos = nTempX;
cObjAdd.m_nYpos = nTempY;
cObjAdd.m_nMoneyNum = sItemInfo.m_nMoneyNum;
cObjAdd.m_nItemID = sItemInfo.m_nItemID;
cObjAdd.m_btItemWidth = sItemInfo.m_nItemWidth;
cObjAdd.m_btItemHeight = sItemInfo.m_nItemHeight;
cObjAdd.m_btColorID = sItemInfo.m_nColorID;
cObjAdd.m_btFlag = 0;
if (sItemInfo.m_nSoundFlag)
cObjAdd.m_btFlag |= 0x01;
if (sItemInfo.m_nMovieFlag)
cObjAdd.m_btFlag |= 0x02;
strcpy(cObjAdd.m_szName, Object[nAddNo].m_szName);
cObjAdd.m_wLength = sizeof(OBJ_ADD_SYNC) - 1 - sizeof(cObjAdd.m_szName) + strlen(cObjAdd.m_szName);
POINT POff[8] =
{
{0, 32},
{-16, 32},
{-16, 0},
{-16, -32},
{0, -32},
{16, -32},
{16, 0},
{16, 32},
};
int nMaxCount = MAX_BROADCAST_COUNT;
SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].BroadCast((BYTE*)&cObjAdd, cObjAdd.m_wLength + 1, nMaxCount, Object[nAddNo].m_nMapX, Object[nAddNo].m_nMapY);
int nConRegion;
for (i = 0; i < 8; i++)
{
nConRegion = SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].m_nConnectRegion[i];
if (nConRegion == -1)
continue;
SubWorld[MapPos.nSubWorld].m_Region[nConRegion].BroadCast((BYTE*)&cObjAdd, cObjAdd.m_wLength + 1, nMaxCount, Object[nAddNo].m_nMapX - POff[i].x, Object[nAddNo].m_nMapY - POff[i].y);
}
SubWorld[MapPos.nSubWorld].m_Region[MapPos.nRegion].AddObj(nAddNo);// m_WorldMessage.Send(GWM_OBJ_ADD, MapPos.nRegion, nAddNo);
return nAddNo;
}
Vào KItem.h tìm KItemCommonAttrib m_CommonAttrib; trên nó có dòng private các bạn sửa thành public ^^
Build và đưa vào server và client. Thế là xong phần build ^^
Cuối cùng các bạn vào client, vào folder Ui tìm đến 2 file có đuôi mở rộng là .lua
Thêm
AddCommand("Alt+Space", "","Switch([[showobjname]])")
sau một hàm AddCommand bất kỳ.
Sau đó chạy server, chạy game và vào phần tùy chọn, chỉnh qua lại giữa chế độ bàn phím mặc định và kết hợp để client load các file lua. vào game vứt vật phẩm ra và ấn Alt+Space.
VỚI ĐIỀU KIỆN LÀ CÁC BẠN CHƯA LÀM HIỆN TÊN OBJ NHƯ CBT HƯỚNG DẪN ^^
Bổ sung phần hiện tiền vạn lượng ^^
Tại KObj.cpp
Các bạn tìm
void KObj::DrawInfo()
{
// return;
if (m_nKind != Obj_Kind_Item)// && m_nKind != Obj_Kind_Money)
return;
int nMpsX, nMpsY, nHeightOff;
DWORD dwColor;
GetMpsPos(&nMpsX, &nMpsY);
nHeightOff = OBJ_SHOW_NAME_Y_OFF;
dwColor = this->m_dwNameColor;
g_pRepresent->OutputText(12, m_szName, KRF_ZERO_END, nMpsX - 12 * g_StrLen(m_szName) / 4, nMpsY, dwColor, 0, nHeightOff);
}
Sửa thành
void KObj::DrawInfo()
{
// return;
if (m_nKind != Obj_Kind_Item && m_nKind != Obj_Kind_Money)
return;
int nMpsX, nMpsY, nHeightOff;
DWORD dwColor;
if (m_nKind == Obj_Kind_Money)
{
char szMoney[64];
char szvMoney[128];
char szlMoney[128];
int m_nvMoneyNum = m_nMoneyNum / 10000;
int m_nlMoneyNum = m_nMoneyNum % 10000;
sprintf(szMoney,"%d l*îng",m_nMoneyNum);
sprintf(szvMoney,"%d v¹n l*îng",m_nvMoneyNum);
sprintf(szlMoney,"%d v¹n %d l*îng",m_nvMoneyNum, m_nlMoneyNum);
GetMpsPos(&nMpsX, &nMpsY);
nHeightOff = OBJ_SHOW_NAME_Y_OFF;
dwColor = 255 << 16 | 217 << 8 | 78;
if (m_nMoneyNum < 10000)
g_pRepresent->OutputText(12, szMoney, KRF_ZERO_END, nMpsX - 12 * g_StrLen(szMoney) / 4, nMpsY, dwColor, 0, nHeightOff);
else if (m_nlMoneyNum == 0)
g_pRepresent->OutputText(12, szvMoney, KRF_ZERO_END, nMpsX - 12 * g_StrLen(szvMoney) / 4, nMpsY, dwColor, 0, nHeightOff);
else
g_pRepresent->OutputText(12, szlMoney, KRF_ZERO_END, nMpsX - 12 * g_StrLen(szlMoney) / 4, nMpsY, dwColor, 0, nHeightOff);
}
else
{
GetMpsPos(&nMpsX, &nMpsY);
nHeightOff = OBJ_SHOW_NAME_Y_OFF;
dwColor = this->m_dwNameColor;
g_pRepresent->OutputText(12, m_szName, KRF_ZERO_END, nMpsX - 12 * g_StrLen(m_szName) / 4, nMpsY, dwColor, 0, nHeightOff);
}}