📄 npc.cpp
字号:
pNewData->z = m_sCurZ;
pNewData->zone_index = m_ZoneIndex;
EnterCriticalSection( &(pCom->m_critSendData) );
pCom->m_arSendData.Add( pNewData );
LeaveCriticalSection( &(pCom->m_critSendData) );
PostQueuedCompletionStatus( pCom->m_hSendIOCP, 0, 0, NULL );
*/
if(nLength <= 0 || nLength >= SEND_BUF_SIZE) return;
int sx = m_sCurX / SIGHT_SIZE_X;
int sy = m_sCurY / SIGHT_SIZE_Y;
int min_x = (sx-1)*SIGHT_SIZE_X; if( min_x < 0 ) min_x = 0;
int max_x = (sx+2)*SIGHT_SIZE_X;
int min_y = (sy-1)*SIGHT_SIZE_Y; if( min_y < 0 ) min_y = 0;
int max_y = (sy+2)*SIGHT_SIZE_Y;
MAP* pMap = g_zone[m_ZoneIndex];
if( !pMap ) return;
if( max_x >= pMap->m_sizeMap.cx ) max_x = pMap->m_sizeMap.cx - 1;
if( max_y >= pMap->m_sizeMap.cy ) max_y = pMap->m_sizeMap.cy - 1;
int temp_uid;
USER* pUser = NULL;
for( int i = min_x; i < max_x; i++ )
{
for( int j = min_y; j < max_y; j++ )
{
temp_uid = pMap->m_pMap[i][j].m_lUser;
if(temp_uid < USER_BAND || temp_uid >= NPC_BAND) continue;
else temp_uid -= USER_BAND;
if( temp_uid >= 0 && temp_uid < MAX_USER )
{
pUser = pCom->GetUserUid(temp_uid);
if ( pUser == NULL ) continue;
if( pUser->m_state == STATE_GAMESTARTED )
{
if( pUser->m_curx == i && pUser->m_cury == j && pUser->m_curz == m_sCurZ )
{
Send( pUser, pBuf, nLength );
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////
// 泅犁 NPC 狼 困摹客 (xpos, ypos) 荤捞狼 芭府甫 拌魂
//
BOOL CNpc::GetDistance(int xpos, int ypos, int dist)
{
if(xpos >= g_zone[m_ZoneIndex]->m_sizeMap.cx || xpos < 0 || ypos >= g_zone[m_ZoneIndex]->m_sizeMap.cy || ypos < 0) return FALSE;
int dx = abs(xpos - m_sCurX);
int dy = abs(ypos - m_sCurY);
if(dx + dy > dist * 2) return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////
// NPC 啊 啊柳 酒捞袍阑 冻焙促.
//
void CNpc::GiveNpcHaveItem(COM *pCom)
{
int temp = 0;
int iPer = 0, iVal = 0;
int iRandom;
int nCount = 1;
int nDnHap = 0;
// SYSTEMTIME gTime;
// GetLocalTime(&gTime);
if(m_NpcVirtualState == NPC_WAIT) return;
/* if(gTime.wDay > 7 && gTime.wDay < 14) // 8老何磐 13老鳖瘤
{
if(m_byClassLevel <= 20) nCount = 1;
else if(m_byClassLevel <= 50) nCount = 2;
else if(m_byClassLevel <= 70) nCount = 3;
else nCount = 5;
}
else
{
*/
if(m_byClassLevel <= 50) nCount = 1;
else nCount = 2;
if( m_sEvent == NPC_EVENT_MOP ) nCount = 4; // 捞亥飘 各老版快 酒捞袍 冻绢龙 冉荐甫 疵赴促.
if( m_sEvent == NPC_EVENT_GREATE_MOP ) nCount = 8; // 竣胶府柯 殿 漂荐 阁胶磐老 版快 10俺甫 冻绢哆赴促.
// }
for(int i = 0; i < nCount; i++)
{
iRandom = myrand(1, 100);
if(iRandom < m_tItemPer)
{
/* if(m_sEvent == NPC_EVENT_MOP)
{
temp = g_arItemTable.GetSize() - 1;
// iRandom = myrand(0, temp);
iRandom = myrand(375, 622); //@@@@@@@@@@@@@@@@@@@@@@@ 捞亥飘甫困茄 烙矫内靛
GiveItemToMap(pCom, iRandom, TRUE);
}
else
{
*/ iRandom = myrand(1, 10000);
for(int i = 2; i < g_NpcItem.m_nField; i += 2)
{
// iPer = g_NpcItem.m_ppItem[i][m_byClassLevel];
iPer = g_NpcItem.m_ppItem[i][m_sHaveItem];
if(iPer == 0) return;
if(iRandom < iPer)
{ // 快急 扁夯抛捞喉甫 曼炼窍扁困秦
// temp = g_NpcItem.m_ppItem[i-1][m_byClassLevel];
temp = g_NpcItem.m_ppItem[i-1][m_sHaveItem];
iVal = temp;
if(temp >= g_arItemTable.GetSize()) return;
if(g_arItemTable[temp]->m_byWear <= 5 || g_arItemTable[temp]->m_byWear == 117 || g_arItemTable[temp]->m_byWear == 20) // 函屈抛捞喉捞促.
{
iVal = IsTransformedItem(g_arItemTable[temp]->m_sSid);
if(iVal == -1) iVal = temp;//return;
}
if (iVal == 845 || iVal == 909 || iVal == 846 || iVal == 907 || iVal == 908) iVal = 847;
GiveItemToMap(pCom, iVal, TRUE);
break;
}
}
// }
}
else if(iRandom < m_tDnPer)
{
// SYSTEMTIME gTime; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Event Code 扁埃悼救 老矫利栏肺 疵妨霖促.
// GetLocalTime(&gTime);
iPer = g_arDNTable[m_byClassLevel]->m_sMinDn;
iVal = g_arDNTable[m_byClassLevel]->m_sMaxDn;
iRandom = myrand(iPer, iVal);
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Event Code 扁埃悼救 老矫利栏肺 疵妨霖促.
/* if(gTime.wMonth < 7) iRandom = iRandom * 2;
else if(gTime.wMonth == 7)
{
if(gTime.wDay <= 7) iRandom = iRandom * 2;
}
// iRandom = iRandom * 2; //Test Server
*/
nDnHap += iRandom;
//GiveItemToMap(pCom, iRandom, FALSE);
}
}
if(nDnHap > 0 )
{
if (nDnHap == 845 || nDnHap == 909 || nDnHap == 846 || nDnHap == 907 || nDnHap == 908) nDnHap = 847;
GiveItemToMap(pCom, nDnHap, FALSE);
}
}
///////////////////////////////////////////////////////////////////////////////////
// 酒捞袍吝 函屈酒捞袍捞 乐绰瘤 魄窜茄促.
//
int CNpc::IsTransformedItem(int sid)
{
int iVal = 0;
int i, j, iRandom;
for(i = 0; i < g_ValItem.m_nRow; i++)
{
if(g_ValItem.m_ppItem[g_ValItem.m_nField-2][i] == sid) // 盖 付瘤阜 鞘靛俊辑 酒捞袍 亲格(6俺 辆幅)
{
iRandom = myrand(1, 100);
for(j = 2; j < g_ValItem.m_nField; j+= 2)
{
iVal = g_ValItem.m_ppItem[j][i];
if(iRandom < iVal)
{
if(sid >= g_arItemTable.GetSize()) return -1;
else return g_ValItem.m_ppItem[j-1][i];
}
}
}
}
return -1;
}
///////////////////////////////////////////////////////////////////////////////////
// 酒捞袍吝 概流 酒捞袍阑 冻绢靛副荐乐绰瘤 魄窜
//
int CNpc::IsMagicItem(COM* pCom, ItemList *pItem, int iTable)
{
int i = 0, j;
int iMagicTemp = 1 , iRareTemp = 1;
int iRandom = myrand( 1, 10000 );
int iMagicCount = 0, iCount = 0;
int nLoop = 0, iType = 0;
int nEventMoon = 0;
int nEventSongpeon = 0;
int nEventBox = 0;
USER* pUser = NULL;
/* SYSTEMTIME gTime; //@@@@@@@@@@@@@@@ Event Code 扁埃悼救 老矫利栏肺 疵妨霖促.
GetLocalTime(&gTime);
if(gTime.wMonth < 7) { iMagicTemp = 10; iRareTemp = 2; }
else if(gTime.wMonth == 7)
{
if(gTime.wDay <= 7) { iMagicTemp = 10; iRareTemp = 2; }
}
*/
if(m_sEvent == NPC_EVENT_MOP) // 泅犁 候遣,凝,胶妮乔坷
{
iMagicTemp = NPC_EVENT_CHANCE;
iRareTemp = NPC_EVENT_CHANCE;
}
else if(m_sEvent == NPC_EVENT_GREATE_MOP) // 竣胶府柯
{
iMagicTemp = 60; //70
iRareTemp = 70; //75
}
if(m_lKillUid >= 0)
{
pUser = GetUser(pCom, m_lKillUid);
if(pUser != NULL && pUser->m_state == STATE_GAMESTARTED)
{
if(pUser->m_dwMagicFindTime != 0) // 概流 颇牢歹甫 冈篮 惑怕捞搁
{
if(iMagicTemp < 40)
{
iMagicTemp *= 10;
iRareTemp *= 10;
}
if(iMagicTemp >= 40 && iMagicTemp < 70)
{
iMagicTemp *= 10;
iRareTemp *= 10;
}
// 70 捞惑捞搁 概流颇牢歹狼 康氢阑 罐瘤 臼档废 茄促.
}
}
}
nEventMoon = NPC_RARE_ITEM * iRareTemp + (NPC_EVENT_MOON - NPC_RARE_ITEM);
nEventSongpeon = nEventMoon + (NPC_EVENT_SONGPEON - NPC_EVENT_MOON);
nEventBox = nEventSongpeon + (NPC_EVENT_BOX - NPC_EVENT_SONGPEON);
if(iRandom <= NPC_MAGIC_ITEM * iMagicTemp) // 概流
{
nLoop = 4;
iType = RARE_ITEM;
}
else if(iRandom > NPC_MAGIC_ITEM * iMagicTemp && iRandom <= NPC_RARE_ITEM * iRareTemp) // 饭绢
{
// if(m_sEvent == NPC_EVENT_GREATE_MOP) nLoop = 10; // more greater
// else nLoop = 2;
nLoop = 2;
iType = MAGIC_ITEM;
}
else if(0 && iRandom > NPC_RARE_ITEM * iRareTemp && iRandom <= nEventMoon)
{
return EVENT_ITEM_MOON;
}
else if(0 && iRandom > nEventMoon && iRandom <= nEventSongpeon)
{
return EVENT_ITEM_SONGPEON;
}
else if(0 && iRandom > nEventSongpeon && iRandom <= nEventBox)
{
return EVENT_ITEM_BOX;
}
else return NORMAL_ITEM; // 老馆酒捞袍
int iTemp = 0;
if(m_ItemUserLevel <= 20) iMagicCount = 42; // 概流牢郸胶 裹困甫 饭骇俊 蝶扼 力茄茄促.
else if(m_ItemUserLevel <= 40) iMagicCount = 106;
else if(m_ItemUserLevel <= 60) iMagicCount = 143;
else iMagicCount = 145;
if(iMagicCount >= g_arMagicItemTable.GetSize()) iMagicCount = g_arMagicItemTable.GetSize() - 1;
while(nLoop > i) // 公炼扒 4俺加己蔼阑 备茄促.
{
iRandom = myrand(0, iMagicCount);
//------------------------------------------------------------------------------------------------
//yskang 0.6 蜡丰荤侩磊俊霸 橇府固决 亮篮 可记狼 酒捞袍捞 冻绢柳促.
if(pUser != NULL)
{
if(pUser->m_iDisplayType !=5 && pUser->m_iDisplayType !=6)//蜡丰 荤侩磊捞促.
{
if(m_ItemUserLevel <= 20)
iRandom = myrand(0, iMagicCount); //亮篮 酒捞袍捞 冻绢龙 犬伏阑 臭牢促.
else
iRandom = myrand(41, iMagicCount);
}
}
//------------------------------------------------------------------------------------------------
if(!g_arMagicItemTable[iRandom]->m_tUse) continue;
if(CheckClassItem(iTable, iRandom) == FALSE)
{
if(i == 0) continue; // 概流篮 扁夯捞 1俺
else if(iType == RARE_ITEM && i <= 2) continue; // 贰绢绰 扁夯捞 3俺
else { i++; continue; }
}
//for(j = 0; j < MAGIC_NUM; j++)
for(j = 0; j < 4; j++)
{
//------------------------------------------------------------------------------------------------------------------
//yskang 0.6 吝汗可记 倾侩^^ 蜡丰 荤侩磊 橇府固决(侗林磊) 老窜 焊幅
/*if(pUser != NULL)
{
if(pUser->m_iDisplayType !=5 && pUser->m_iDisplayType !=6)//蜡丰 荤侩磊老 版快
{
if(pItem->tMagic[j] > 0) continue; // 捞固 浇吩俊 蔼捞 乐栏搁 逞绢皑
else
{
pItem->tMagic[j] = iRandom; i++;
if(g_arMagicItemTable[iRandom]->m_tLevel > 0) pItem->sLevel += g_arMagicItemTable[iRandom]->m_tLevel;
if(g_arMagicItemTable[pItem->tMagic[j]]->m_sSubType == MAGIC_DURATION_UP)
{
pItem->sDuration += g_arMagicItemTable[iRandom]->m_sChangeValue; // 郴备仿 刘啊 加己篮 悸泼瞪锭
}
break;
}
}
}*/
//-------------------------------------------------------------------------------------------------------------------
iCount = g_arMagicItemTable[pItem->tMagic[j]]->m_sSubType;
if(iCount != 0 && iCount == g_arMagicItemTable[iRandom]->m_sSubType) // 加己捞 般磨荐 乐栏骨肺 捞吝 奴蔼父 急琶
{
iCount = g_arMagicItemTable[pItem->tMagic[j]]->m_sChangeValue;
if(iCount < g_arMagicItemTable[iRandom]->m_sChangeValue)
{
iTemp = g_arMagicItemTable[pItem->tMagic[j]]->m_tLevel;
if(pItem->sLevel - iTemp > 0) pItem->sLevel -= iTemp;
pItem->sLevel += g_arMagicItemTable[iRandom]->m_tLevel;
pItem->tMagic[j] = iRandom;
if(g_arMagicItemTable[pItem->tMagic[j]]->m_sSubType == MAGIC_DURATION_UP)
{
iTemp = g_arMagicItemTable[pItem->tMagic[j]]->m_sChangeValue;
if(pItem->sDuration - iTemp > 0) pItem->sDuration -= iTemp;
pItem->sDuration += g_arMagicItemTable[iRandom]->m_sChangeValue; // 郴备仿 刘啊 加己篮 悸泼瞪锭
}
break;
}
else if(iCount == g_arMagicItemTable[iRandom]->m_sChangeValue) break;
}
if(pItem->tMagic[j] > 0) continue; // 捞固 浇吩俊 蔼捞 乐栏搁 逞绢皑
else
{
pItem->tMagic[j] = iRandom; i++;
if(g_arMagicItemTable[iRandom]->m_tLevel > 0) pItem->sLevel += g_arMagicItemTable[iRandom]->m_tLevel;
if(g_arMagicItemTable[pItem->tMagic[j]]->m_sSubType == MAGIC_DURATION_UP)
{
pItem->sDuration += g_arMagicItemTable[iRandom]->m_sChangeValue; // 郴备仿 刘啊 加己篮 悸泼瞪锭
}
break;
}
}
// i++;
}
return iType;
}
///////////////////////////////////////////////////////////////////////////////////
// NPC Item阑 甘俊 冻焙促.
//
void CNpc::GiveItemToMap(COM *pCom, int iItemNum, BOOL bItem, int iEventNum)
{
int i, iRandom = 0;
int iType = 0;
BYTE tEBodySid = 0;
CPoint pt;
pt = FindNearRandomPointForItem(m_sCurX, m_sCurY); // 泅犁 磊扁谅钎甫 力寇茄 24沫
if(pt.x <= -1 || pt.y <= -1) return;
if(pt.x >= g_zone[m_ZoneIndex]->m_sizeMap.cx || pt.y >= g_zone[m_ZoneIndex]->m_sizeMap.cy) return;
ItemList *pMapItem = NULL;
if(InterlockedCompareExchange((PVOID*)&g_zone[m_ZoneIndex]->m_pMap[pt.x][pt.y].m_FieldUse, (PVOID)1, (PVOID)0) == (PVOID*)0)
{
pMapItem = new ItemList;
if(!bItem) // 捣老 版快
{
pMapItem->tType = TYPE_MONEY;
pMapItem->dwMoney = iItemNum;
pMapItem->uid[0] = m_iHaveItemUid[0].uid;
pMapItem->uid[1] = m_iHaveItemUid[1].uid;
pMapItem->uid[2] = m_iHaveItemUid[2].uid;
pMapItem->SuccessRate[0] = (BYTE)m_iHaveItemUid[0].nDamage;
pMapItem->SuccessRate[1] = (BYTE)m_iHaveItemUid[1].nDamage;
pMapItem->SuccessRate[2] = (BYTE)m_iHaveItemUid[2].nDamage;
pMapItem->dwTime = GetItemThrowTime();
//GetLocalTime(&pMapItem->ThrowTime);
}
else // 酒捞袍 格废老版快
{
/* if(iItemNum > 1000 && iItemNum <= 1012)
{
//捞亥飘
int iItemSid = 0;
if(iItemNum == 1001) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_ATT7_ITEM; } // 7诀 公扁
else if(iItemNum == 1002) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_DEF7_ITEM; }// 7诀 规绢备
else if(iItemNum == 1003) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_ATT6_ITEM; }// 6诀 公扁
else if(iItemNum == 1004) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_DEF6_ITEM; }// 6诀 规绢备
else if(iItemNum == 1005) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_ATT_ITEM; }// 5诀 公扁
else if(iItemNum == 1006) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_DEF_ITEM; }// 5诀 规绢备
else if(iItemNum == 1007) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_ATT4_ITEM; }// 4诀 公扁
else if(iItemNum == 1008) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_DEF4_ITEM; }// 4诀 规绢备
else if(iItemNum == 1009) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_ATT3_ITEM; }// 3诀 公扁
else if(iItemNum == 1010) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_DEF3_ITEM; }// 3诀 规绢备
else if(iItemNum == 1011) { iItemSid = NPC_EVENT_INIT_STAT; pMapItem->tIQ = EVENT_INIT_STAT_ITEM; }// 必距
else if(iItemNum == 1012) { iItemSid = NPC_EVENT_ITEM; pMapItem->tIQ = EVENT_USER_GAME_TIME; }// 俺牢 沥咀鼻
else
{
if(pMapItem) delete pMapItem;
return;
}
pMapItem->tType = TYPE_ITEM;
pMapItem->sLevel = g_arItemTable[iItemSid]->m_byRLevel;
pMapItem->sSid = g_arItemTable[iItemSid]->m_sSid;
pMapItem->sDuration = g_arItemTable[iItemSid]->m_sDuration;
pMapItem->sCount = 1;
pMapItem->sBullNum = g_arItemTable[iItemSid]->m_sBullNum;
SetISerialToItem(pMapItem, iEventNum);
/* for(i = 0; i < MAGIC_NUM; i++)
{
pMapItem->tMagic[i] = 0; // 唱吝俊 Magic Item 眠啊且 巴
pMapItem->tMagic[i] = g_arAddEventItemTable[iEventNum]->m_s
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -