📄 npc.cpp
字号:
/* if(gTime.wDay >= 28 && gTime.wDay <= 29) // 8老何磐 13老鳖瘤
{
exp = (int)(exp * 1.2);
}
*/
/* if(pUser->m_bNowBuddy)
{
plusExp = (DWORD)((double)(exp * 5)/100 + 0.5); // 滚叼盔捞搁 公炼扒 5%捞垫
if(pUser->m_dwHiExpTime > 0)
{
pUser->GetExp(plusExp + (exp * 2));
}
else
{
if( (plusExp + exp) <= m_sExp ) pUser->GetExp(plusExp + exp);
else pUser->GetExp(m_sExp);
}
}
else
{
if(pUser->m_dwHiExpTime > 0) pUser->GetExp(exp * 2);
else pUser->GetExp(exp);
}*/
//---------------------------------------------------------------------------------------------
//--yskang 0.6 蜡丰 荤侩磊俊霸 橇府固决 力傍 - 版氰摹甫 臭咯霖促.
if(pUser->m_iDisplayType != 5 && pUser->m_iDisplayType != 6)
pUser->GetExpCommon((int)(exp * 1.1));
else
pUser->GetExpCommon((int)(exp * 0.8)); //公丰 荤侩磊绰 版氰摹甫 撤冕促.
//---------------------------------------------------------------------------------------------
}
// GiveEventItemToUser(pUser); //@@@@@@@@@@@@@@@@@@@@@@@@
}
//////////////////////////////////////////////////////////////////////////////
// 泅犁 各阑 扁霖栏肺 茄 拳搁 裹困救俊 乐绰瘤 魄窜
//
void CNpc::IsUserInSight(COM *pCom)
{
int j;
USER* pUser = NULL;
int iSearchRange = m_bySearchRange; // 烙矫肺 棱疽促.
int min_x, min_y, max_x, max_y;
min_x = m_sCurX - 12; if( min_x < 0 ) min_x = 0;
min_y = m_sCurY - 13; if( min_y < 0 ) min_y = 0;
max_x = m_sCurX + 12;
max_y = m_sCurY + 13;
if(max_x >= g_zone[m_ZoneIndex]->m_sizeMap.cx) max_x = g_zone[m_ZoneIndex]->m_sizeMap.cx - 1;
if(max_y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) max_y = g_zone[m_ZoneIndex]->m_sizeMap.cy - 1;
int ix, iy;
int target_uid;
int uid;
int iLen = 0;
for(j = 0; j < NPC_HAVE_USER_LIST; j++)
{
m_DamagedUserList[j].bIs = FALSE;
}
for(ix = min_x; ix <= max_x; ix++)
{
for(iy = min_y; iy <= max_y; iy++)
{
target_uid = m_pOrgMap[ix][iy].m_lUser;
if( target_uid >= USER_BAND && target_uid < NPC_BAND )
{
uid = target_uid - USER_BAND;
for(j = 0; j < NPC_HAVE_USER_LIST; j++)
{ // 爱绊乐绰 府胶飘惑狼 蜡历客 鞍促搁
if(m_DamagedUserList[j].iUid == uid) // 弥辆 ID甫 厚背秦辑 悼老窍搁
{
pUser = pCom->GetUserUid(uid);
if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED || pUser->m_curz != m_sCurZ) continue;
iLen = strlen(pUser->m_strUserID);
if(iLen <= 0 || iLen > CHAR_NAME_LENGTH) continue;
if(strcmp(pUser->m_strUserID, m_DamagedUserList[j].strUserID) == 0)
{ // 捞锭辑具 粮犁茄促绰 钎矫甫 茄促.
m_DamagedUserList[j].bIs = TRUE;
}
}
}
}
}
}
}
//////////////////////////////////////////////////////////////////////////////
// NPC DEAD Packet 阑 牢辟 蜡历俊霸 焊辰促.
//
int CNpc::SendDead(COM *pCom, int type)
{
// ASSERT(pCom);
if(!pCom) return 0;
if(m_NpcState != NPC_DEAD || m_sHP > 0) return 0;
CBufferEx TempBuf;
CPoint pt = ConvertToClient(m_sCurX, m_sCurY);
TempBuf.Add(DEAD);
TempBuf.Add((short)(m_sNid + NPC_BAND));
TempBuf.Add((short)pt.x);
TempBuf.Add((short)pt.y);
SendInsight(pCom, TempBuf, TempBuf.GetLength());
if(type) GiveNpcHaveItem(pCom); // 酒捞袍 冻备扁(版厚捍捞搁 救冻绢飘覆)
return m_sRegenTime;
}
////////////////////////////////////////////////////////////////////////////////
// 林函俊 利捞 绝芭唱 荐悼各狼 版快 烙狼狼 痢栏肺 辨茫扁甫 茄 饶 框流牢促.
//
BOOL CNpc::RandomMove(COM *pCom)
{
if(m_bySearchRange == 0) return FALSE;
if(pCom == NULL) return FALSE;
if(m_tNpcType == NPCTYPE_GUILD_DOOR) return FALSE; // 捞悼救窍霸...
if(m_tNpcType == NPCTYPE_GUARD || m_tNpcType == NPCTYPE_GUILD_GUARD) return FALSE; // 捞悼救窍霸...
// NPC 啊 檬扁 困摹甫 哈绢车绰瘤 魄窜茄促.
BOOL bIsIn = IsInRange();
MAP* pMap = g_zone[m_ZoneIndex];
if( !pMap ) return FALSE;
if( !pMap->m_pMap ) return FALSE;
CPoint pt;
int nLoop = 0;
int nDestX = -1, nDestY = -1;
int min_x, min_y, max_x, max_y;
int temp_minx = 0, temp_miny = 0, temp_maxx = 0, temp_maxy = 0;
CRect rectIn;
if(bIsIn) // NPC 啊 檬扁 困摹甫 哈绢唱瘤 臼疽栏搁
{
/*alisia
int temp_range = m_bySearchRange / 2;
min_x = m_sCurX - temp_range; if(min_x < 0) min_x = 0;
min_y = m_sCurY - temp_range; if(min_y < 0) min_y = 0;
max_x = m_sCurX + temp_range; if(max_x >= g_zone[m_ZoneIndex]->m_sizeMap.cx) max_x = g_zone[m_ZoneIndex]->m_sizeMap.cx - 1;
max_y = m_sCurY + temp_range; if(max_y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) max_y = g_zone[m_ZoneIndex]->m_sizeMap.cy - 1;
rectIn.IntersectRect(CRect(m_nInitMinX, m_nInitMinY, m_nInitMaxX, m_nInitMaxY), CRect(min_x, min_y, max_x, max_y));
nLoop = 0;
while(1)
{
nDestX = myrand(rectIn.left, rectIn.right);
nDestY = myrand(rectIn.top, rectIn.bottom);
if(pMap->m_pMap[nDestX][nDestY].m_bMove != 0 || pMap->m_pMap[nDestX][nDestY].m_lUser != 0)
{
if(nLoop++ >= 10)
{
TRACE("NOT FIND~~\n");
return FALSE;
}
continue;
}
break;
}
alisia*/
m_bRandMove = TRUE; // 泅犁 框流烙捞 8规氢 急琶 框流烙牢瘤甫 唱鸥辰促 - PathFind() 窃荐 救俊辑 府悸茄促
m_arRandMove.RemoveAll();
int axis_x[3]; axis_x[0] = -1; axis_x[1] = 0; axis_x[2] = 1;
int axis_y[3]; axis_y[0] = -1; axis_y[1] = 0; axis_y[2] = 1;
int rand_x, rand_y, rand_d;
rand_x = myrand( 0, 2 );
rand_y = myrand( 0, 2 );
rand_d = myrand( 1, 5 );
for( int i = 1; i <= rand_d; i++ )
{
m_arRandMove.Add( CPoint( axis_x[rand_x] * i, axis_y[rand_y] * i ) );
}
m_min_x = m_sCurX;
m_min_y = m_sCurY;
return TRUE;
}
else // NPC 啊 檬扁 困摹甫 哈绢车栏搁
{
int x = 0, y = 0;
min_x = m_sCurX;
min_y = m_sCurY;
max_x = m_sCurX;
max_y = m_sCurY;
if(m_nInitMinX < m_sCurX) {min_x -= m_bySearchRange; x += 1;} if(min_x < 0) min_x = 0;
if(m_nInitMinY < m_sCurY) {min_y -= m_bySearchRange; y += 1;} if(min_y < 0) min_y = 0;
if(m_nInitMaxX > m_sCurX) {max_x += m_bySearchRange; x += 1;} if(max_x >= g_zone[m_ZoneIndex]->m_sizeMap.cx) max_x = g_zone[m_ZoneIndex]->m_sizeMap.cx - 1;
if(m_nInitMaxY > m_sCurY) {max_y += m_bySearchRange; y += 1;} if(max_y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) max_y = g_zone[m_ZoneIndex]->m_sizeMap.cy - 1;
nLoop = 0;
while(1)
{
nDestX = min_x + (rand() % (m_bySearchRange * x + 1));
if(nDestX > max_x) nDestX = max_x;
nDestY = min_y + (rand() % (m_bySearchRange * y + 1));
if(nDestY > max_y) nDestY = max_y;
if(pMap->m_pMap[nDestX][nDestY].m_bMove != 0 || pMap->m_pMap[nDestX][nDestY].m_lUser != 0)
{
if(nLoop++ >= 10) return FALSE;
continue;
}
break;
}
}
if(nDestX < 0 || nDestY < 0)
{
return FALSE;
}
// Run Path Find ---------------------------------------------//
CPoint start, end;
start.x = m_sCurX - min_x;
start.y = m_sCurY - min_y;
end.x = nDestX - min_x;
end.y = nDestY - min_y;
if(start.x < 0 || start.y < 0 || end.x < 0 || end.y < 0)
{
return FALSE;
}
m_ptDest.x = nDestX;
m_ptDest.y = nDestY;
m_min_x = min_x;
m_min_y = min_y;
m_max_x = max_x;
m_max_y = max_y;
return PathFind(start, end);
}
/////////////////////////////////////////////////////////////////////////////////////
// NPC 啊 檬扁 积己困摹 救俊 乐绰瘤 八荤
//
BOOL CNpc::IsInRange()
{
// NPC 啊 檬扁 困摹甫 哈绢车绰瘤 魄窜茄促.
// CRect rect(m_nInitMinX, m_nInitMinY, m_nInitMaxX, m_nInitMaxY);
// return rect.PtInRect(CPoint(m_sCurX, m_sCurY));
if( m_nInitMinX > m_sCurX || m_nInitMaxX < m_sCurX ) return FALSE;
if( m_nInitMinY > m_sCurY || m_nInitMaxY < m_sCurY ) return FALSE;
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// 矫具啊 函版灯绰瘤 魄窜窍绊 函版灯促搁 函版郴侩阑 努扼捞攫飘肺 傈价茄促.
//
void CNpc::SightRecalc(COM* pCom)
{
int sx, sy;
sx = m_sCurX / SIGHT_SIZE_X;
sy = m_sCurY / SIGHT_SIZE_Y;
int dir_x = 0;
int dir_y = 0;
if( sx == m_presx && sy == m_presy ) return;
if( m_presx == -1 || m_presy == -1 )
{
dir_x = 0;
dir_y = 0;
}
else
{
if( sx > m_presx && abs(sx-m_presx) == 1 ) dir_x = DIR_H;
if( sx < m_presx && abs(sx-m_presx) == 1 ) dir_x = DIR_L;
if( sy > m_presy && abs(sy-m_presy) == 1 ) dir_y = DIR_H;
if( sy < m_presy && abs(sy-m_presy) == 1 ) dir_y = DIR_L;
if( abs(sx-m_presx) > 1 ) dir_x = DIR_OUTSIDE;
if( abs(sy-m_presy) > 1 ) dir_y = DIR_OUTSIDE;
}
int prex = m_presx;
int prey = m_presy;
m_presx = sx;
m_presy = sy;
SendUserInfoBySightChange(dir_x, dir_y, prex, prey, pCom);
}
//////////////////////////////////////////////////////////////////////////////////////////
// 矫具函版栏肺 牢茄 蜡历沥焊 傈价
//
void CNpc::SendUserInfoBySightChange(int dir_x, int dir_y, int prex, int prey, COM *pCom)
{
int min_x = 0, min_y = 0;
int max_x = 0, max_y = 0;
int sx = m_presx;
int sy = m_presy;
int modify_index = 0;
char modify_send[1024]; ::ZeroMemory(modify_send, sizeof(modify_send));
FillNpcInfo(modify_send, modify_index, INFO_MODIFY);
int delete_index = 0;
char delete_send[1024]; ::ZeroMemory(delete_send, sizeof(delete_send));
FillNpcInfo(delete_send, delete_index, INFO_DELETE);
if( prex == -1 || prey == -1 )
{
min_x = (sx-1)*SIGHT_SIZE_X;
max_x = (sx+2)*SIGHT_SIZE_X;
min_y = (sy-1)*SIGHT_SIZE_Y;
max_y = (sy+2)*SIGHT_SIZE_Y;
SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
return;
}
if( dir_x == DIR_OUTSIDE || dir_y == DIR_OUTSIDE )
{
min_x = (prex-1)*SIGHT_SIZE_X;
max_x = (prex+2)*SIGHT_SIZE_X;
min_y = (prey-1)*SIGHT_SIZE_Y;
max_y = (prey+2)*SIGHT_SIZE_Y;
SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
min_x = (sx-1)*SIGHT_SIZE_X;
max_x = (sx+2)*SIGHT_SIZE_X;
min_y = (sy-1)*SIGHT_SIZE_Y;
max_y = (sy+2)*SIGHT_SIZE_Y;
SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
return;
}
if( dir_x > 0 )
{
min_x = (prex-1)*SIGHT_SIZE_X;
max_x = (prex)*SIGHT_SIZE_X;
min_y = (prey-1)*SIGHT_SIZE_Y;
max_y = (prey+2)*SIGHT_SIZE_Y;
SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
min_x = (sx+1)*SIGHT_SIZE_X;
max_x = (sx+2)*SIGHT_SIZE_X;
min_y = (sy-1)*SIGHT_SIZE_Y;
max_y = (sy+2)*SIGHT_SIZE_Y;
SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
}
if( dir_y > 0 )
{
min_x = (prex-1)*SIGHT_SIZE_X;
max_x = (prex+2)*SIGHT_SIZE_X;
min_y = (prey-1)*SIGHT_SIZE_Y;
max_y = (prey)*SIGHT_SIZE_Y;
SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
min_x = (sx-1)*SIGHT_SIZE_X;
max_x = (sx+2)*SIGHT_SIZE_X;
min_y = (sy+1)*SIGHT_SIZE_Y;
max_y = (sy+2)*SIGHT_SIZE_Y;
SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
}
if( dir_x < 0 )
{
min_x = (prex+1)*SIGHT_SIZE_X;
max_x = (prex+2)*SIGHT_SIZE_X;
min_y = (prey-1)*SIGHT_SIZE_Y;
max_y = (prey+2)*SIGHT_SIZE_Y;
SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
min_x = (sx-1)*SIGHT_SIZE_X;
max_x = (sx)*SIGHT_SIZE_X;
min_y = (sy-1)*SIGHT_SIZE_Y;
max_y = (sy+2)*SIGHT_SIZE_Y;
SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
}
if( dir_y < 0 )
{
min_x = (prex-1)*SIGHT_SIZE_X;
max_x = (prex+2)*SIGHT_SIZE_X;
min_y = (prey+1)*SIGHT_SIZE_Y;
max_y = (prey+2)*SIGHT_SIZE_Y;
SendToRange(pCom, delete_send, delete_index, min_x, min_y, max_x, max_y);
min_x = (sx-1)*SIGHT_SIZE_X;
max_x = (sx+2)*SIGHT_SIZE_X;
min_y = (sy-1)*SIGHT_SIZE_Y;
max_y = (sy)*SIGHT_SIZE_Y;
SendToRange(pCom, modify_send, modify_index, min_x, min_y, max_x, max_y);
}
}
////////////////////////////////////////////////////////////////////////////////
// 茄拳搁郴狼 蜡历俊霸父 沥焊傈价
//
void CNpc::SendExactScreen(COM* pCom, TCHAR *pBuf, int nLength)
{
if(nLength <= 0 || nLength >= SEND_BUF_SIZE) return;
SEND_DATA* pNewData = NULL;
pNewData = new SEND_DATA;
if(pNewData == NULL) return;
pNewData->flag = SEND_SCREEN;
pNewData->len = nLength;
::CopyMemory(pNewData->pBuf, pBuf, nLength);
pNewData->uid = 0;
pNewData->x = m_sCurX;
pNewData->y = m_sCurY;
pNewData->z = m_sCurZ;
pNewData->zone_index = m_ZoneIndex;
pCom->Send(pNewData);
if(pNewData) delete pNewData;
}
///////////////////////////////////////////////////////////////////////////////
// 矫具救俊 乐绰 蜡历俊霸 单捞磐 傈价
//
void CNpc::SendInsight(COM* pCom, TCHAR *pBuf, int nLength)
{
/*
if(nLength <= 0 || nLength >= SEND_BUF_SIZE) return;
SEND_DATA* pNewData = NULL;
pNewData = new SEND_DATA;
if(pNewData == NULL) return;
pNewData->flag = SEND_INSIGHT;
pNewData->len = nLength;
::CopyMemory(pNewData->pBuf, pBuf, nLength);
pNewData->uid = 0;
pNewData->x = m_sCurX;
pNewData->y = m_sCurY;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -