⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 npc.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -