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

📄 area.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			packet.u.server_npc_remove.server_id = id + 10000;
			QueuePacket(c, cn, &packet, 1);
			
			if (NPCList[id].ctrlpc == cn)
			{
				NPCList[id].ctrlpc = -1;
				
				for (int i = 0 ; i < MAX_PC_CONTROL_NPC ; ++i)
				{
					if (c[cn].chrlst.ctrlnpc[i] == id)
					{
						c[cn].chrlst.ctrlnpc[i] = -1;
					}
				}
			}

			break;
		}
	case 3:
		{
			t_packet packet;
			packet.h.header.type = CMD_ITEM_REMOVE;
			packet.h.header.size = sizeof(t_server_item_remove);
			packet.u.server_item_remove.item_id	= id;
			QueuePacket(c, cn, &packet, 1);
			break;
		}
	}

	return 1;
}

int GetAreaTableCount(t_connection c[], int cn, int type)
{
	if (type == 0) // PC
	{
		for (int i = 0; i < MAX_AREA_BUFFER; ++i)
		{
			if (c[cn].area_tbl[i].bAlive == FALSE)
			{
				return i;
			}
		}
	}
	else // NPC
	{
		for (int i = 0; i < MAX_AREA_BUFFER; ++i)
		{
			if (NPCList[cn].area_tbl[i].bAlive == FALSE)
			{
				return i;
			}
		}
	}
	
	return -1;
}

int AddAreaNPCTable(t_connection c[], int cn, int type, int id)
{
	for (int i = 0; i < MAX_AREA_BUFFER; ++i)
	{
		if (NPCList[id].area_tbl[i].bAlive == TRUE)
		{
			if (NPCList[id].area_tbl[i].Type == 1 && NPCList[id].area_tbl[i].ID == cn)
			{
				return 0;
			}
		}
	}

	int cnt = GetAreaTableCount(c, id, 1);

	if (cnt < 0)
	{
		return -1;
	}

	NPCList[id].area_tbl[cnt].Type = 1;
	NPCList[id].area_tbl[cnt].ID = cn;
	NPCList[id].area_tbl[cnt].bAlive = TRUE;
	return 1;
}

int AddAreaTable(t_connection c[], int cn, int type, int id)
{	
	if (type == 2) // NPC
	{
		AddAreaNPCTable(c, cn, type, id);
	}
	
	for (int i = 0; i < MAX_AREA_BUFFER; ++i)
	{
		if (c[cn].area_tbl[i].bAlive == TRUE)
		{
			if (c[cn].area_tbl[i].Type == type && c[cn].area_tbl[i].ID == id)
			{
				return 0;
			}
		}
	}
	
	const int cnt = GetAreaTableCount(c, cn, 0);

	if (cnt < 0)
	{
		return -1;
	}

	c[cn].area_tbl[cnt].Type = type;
	c[cn].area_tbl[cnt].ID = id;
	c[cn].area_tbl[cnt].bAlive = TRUE;
	SendAddArea(c, cn, type, id);
	
	return 1;
}

int CheckAreaPC(t_connection c[], int cn, int ID)
{
	if (c[ID].chrlst.X >= c[cn].chrlst.X-ADD_AREA_X && 
	    c[ID].chrlst.X <= c[cn].chrlst.X+ADD_AREA_X &&
	    c[ID].chrlst.Y >= c[cn].chrlst.Y-ADD_AREA_Y &&
	    c[ID].chrlst.Y <= c[cn].chrlst.Y+ADD_AREA_Y)
	{
		if (AddAreaTable(c, cn, 1, ID) < 0)
		{
			return -1;
		}

		return 1;
	}

	return 0;
}
	
int CheckAreaAllPC(t_connection c[], int cn)
{	
	for (int i = 0; i < PC_COUNT; ++i)
	{
		if (PC_TABLE[i].ID != cn)
		{
			if (CheckAreaPC(c, cn, PC_TABLE[i].ID) == 1)
			{
				AddAreaTable(c, PC_TABLE[i].ID, 1, cn);
			}
		}
	}
	
	for (int j = 0; j < NPC_COUNT; ++j)
	{
		if (NPC_TABLE[j].X >= c[cn].chrlst.X-ADD_AREA_X && 
			NPC_TABLE[j].X <= c[cn].chrlst.X+ADD_AREA_X && 
			NPC_TABLE[j].Y >= c[cn].chrlst.Y-ADD_AREA_Y && 
			NPC_TABLE[j].Y <= c[cn].chrlst.Y+ADD_AREA_Y)
		{
			if (AddAreaTable(c, cn, 2, NPC_TABLE[j].ID) < 0)
			{
				break;
			}
		}
	}
	
	for (int k = 0; k < ITEM_COUNT; ++k)
	{
		if (ITEM_TABLE[k].X >= c[cn].chrlst.X-ADD_AREA_X && 
		    ITEM_TABLE[k].X <= c[cn].chrlst.X+ADD_AREA_X && 
		    ITEM_TABLE[k].Y >= c[cn].chrlst.Y-ADD_AREA_Y && 
		    ITEM_TABLE[k].Y <= c[cn].chrlst.Y+ADD_AREA_Y)
		{
			if (AddAreaTable(c, cn, 3, ITEM_TABLE[k].ID) < 0)
			{
				break;
			}
		}
	}
	
	return 1;
}

void RemoveAllPC(t_connection c[], int cn)
{
	for (int i = 0; i < PC_COUNT; ++i)
	{
		if (PC_TABLE[i].ID != cn)
		{
			for (int j = 0; j < MAX_AREA_BUFFER; ++j)
			{
				if (c[PC_TABLE[i].ID].area_tbl[j].bAlive == TRUE)
				{
					if (c[PC_TABLE[i].ID].area_tbl[j].Type == 1 && c[PC_TABLE[i].ID].area_tbl[j].ID == cn)
					{
						c[PC_TABLE[i].ID].area_tbl[j].bAlive = FALSE;
						SendRemoveArea(c, PC_TABLE[i].ID, 1, cn);
					}
				}
			}
		}
	}
}

int RemoveAreaAllPC(t_connection c[], int cn)
{
	for (int i = 0; i < MAX_AREA_BUFFER; ++i)
	{
		int x = 0, y = 0;

		if (c[cn].area_tbl[i].bAlive == TRUE)
		{
			if (c[cn].area_tbl[i].Type == 1) // PC
			{
				x = c[c[cn].area_tbl[i].ID].chrlst.X;
				y = c[c[cn].area_tbl[i].ID].chrlst.Y;
				
				if (x <= c[cn].chrlst.X-REM_AREA_X ||
					x >= c[cn].chrlst.X+REM_AREA_X ||
					y <= c[cn].chrlst.Y-REM_AREA_Y ||
					y >= c[cn].chrlst.Y+REM_AREA_Y)
				{
					c[cn].area_tbl[i].bAlive = FALSE;
					SendRemoveArea(c, cn, 1, c[cn].area_tbl[i].ID);
					
					for (int j = 0; j < MAX_AREA_BUFFER; ++j)
					{
						if (c[c[cn].area_tbl[i].ID].area_tbl[j].bAlive == TRUE)
						{
							if (c[c[cn].area_tbl[i].ID].area_tbl[j].Type == 1 && c[c[cn].area_tbl[i].ID].area_tbl[j].ID == cn)
							{
								c[c[cn].area_tbl[i].ID].area_tbl[j].bAlive = FALSE;
								SendRemoveArea(c, c[cn].area_tbl[i].ID, 1, cn);
							}
						}
					}
				}
			}
			else if(c[cn].area_tbl[i].Type == 2) // NPC
			{
				x = NPCList[c[cn].area_tbl[i].ID].X;
				y = NPCList[c[cn].area_tbl[i].ID].Y;
				
				if (x <= c[cn].chrlst.X-REM_AREA_X ||
					x >= c[cn].chrlst.X+REM_AREA_X ||
					y <= c[cn].chrlst.Y-REM_AREA_Y ||
					y >= c[cn].chrlst.Y+REM_AREA_Y)
				{
					c[cn].area_tbl[i].bAlive = FALSE;
					SendRemoveArea(c, cn, 2, c[cn].area_tbl[i].ID);
				}
			}
			else if(c[cn].area_tbl[i].Type == 3) // ITEM
			{
				x = ItemList[c[cn].area_tbl[i].ID].x;
				y = ItemList[c[cn].area_tbl[i].ID].y;
				
				if (x <= c[cn].chrlst.X-REM_AREA_X ||
					x >= c[cn].chrlst.X+REM_AREA_X ||
					y <= c[cn].chrlst.Y-REM_AREA_Y ||
					y >= c[cn].chrlst.Y+REM_AREA_Y)
				{
					c[cn].area_tbl[i].bAlive = FALSE;
					SendRemoveArea(c, cn, 3, c[cn].area_tbl[i].ID);
				}
			}
			else
			{
				continue;
			}
		}
	}
	
	return 1;
}

int CheckAreaAllNPC(t_connection c[], int n)
{
	for (int i = 0; i < PC_COUNT; ++i)
	{
		if (NPCList[n].X >= c[PC_TABLE[i].ID].chrlst.X-ADD_AREA_X && 
		    NPCList[n].X <= c[PC_TABLE[i].ID].chrlst.X+ADD_AREA_X && 
		    NPCList[n].Y >= c[PC_TABLE[i].ID].chrlst.Y-ADD_AREA_Y && 
			NPCList[n].Y <= c[PC_TABLE[i].ID].chrlst.Y+ADD_AREA_Y)
		{					   
			AddAreaTable(c, PC_TABLE[i].ID, 2, n);
		}
	}

	return 0;
}

int RemoveAllNPC(t_connection c[], int n)
{	// 葛电 PC俊辑 NPC n阑 力芭茄促. 
	for (int i = 0; i < PC_COUNT; ++i)
	{
		for (int j = 0; j < MAX_AREA_BUFFER; ++j)
		{
			if (c[PC_TABLE[i].ID].area_tbl[j].bAlive == TRUE)
			{
				if (c[PC_TABLE[i].ID].area_tbl[j].Type == 2 && c[PC_TABLE[i].ID].area_tbl[j].ID == n)
				{
					c[PC_TABLE[i].ID].area_tbl[j].bAlive = FALSE;
					SendRemoveArea(c, PC_TABLE[i].ID, 2, n);
				}
			}
		}
	}

	return 0;
}

int RemoveAreaAllNPC(t_connection c[], int n)
{
	for (int i = 0; i < MAX_AREA_BUFFER; ++i)
	{
		if (NPCList[n].area_tbl[i].bAlive == TRUE)
		{
			const int cn = NPCList[n].area_tbl[i].ID;
			const int x  = c[cn].chrlst.X;
			const int y  = c[cn].chrlst.Y;
			
			if (NPCList[n].X <= x-REM_AREA_X || 
				NPCList[n].X >= x+REM_AREA_X || 
				NPCList[n].Y <= y-REM_AREA_Y || 
				NPCList[n].Y >= y+REM_AREA_Y)
			{
				NPCList[n].area_tbl[i].bAlive = FALSE;
				SendRemoveArea(c, cn, 2, n);
				
				for (int j = 0; j < MAX_AREA_BUFFER; j ++)
				{
					if (c[cn].area_tbl[j].bAlive == TRUE)
					{
						if (c[cn].area_tbl[j].Type == 2 && c[cn].area_tbl[j].ID == n)
						{
							c[cn].area_tbl[j].bAlive = FALSE;
							SendRemoveArea(c, cn, 2, n);
						}
					}
				}
			}
		}
	}
	
	return 0;
}

int CheckAreaAllItem(t_connection c[], int n)
{
	for (int i = 0; i < PC_COUNT; ++i)
	{
		if (ItemList[n].x >= c[PC_TABLE[i].ID].chrlst.X-ADD_AREA_X && 
			ItemList[n].x <= c[PC_TABLE[i].ID].chrlst.X+ADD_AREA_X && 
			ItemList[n].y >= c[PC_TABLE[i].ID].chrlst.Y-ADD_AREA_Y && 
			ItemList[n].y <= c[PC_TABLE[i].ID].chrlst.Y+ADD_AREA_Y)
		{
			AddAreaTable(c, PC_TABLE[i].ID, 3, n);
		}
	}
	
	return 0;
}

int CommandAllItem(t_connection c[], int n, int command)
{
	for (int i = 0; i < PC_COUNT; ++i)
	{
		for (int j = 0; j < MAX_AREA_BUFFER; ++j)
		{
			if (c[PC_TABLE[i].ID].area_tbl[j].bAlive == TRUE)
			{	// Type捞 酒捞袍捞搁辑 n锅掳 Item捞搁...
				if (c[PC_TABLE[i].ID].area_tbl[j].Type == 3 && c[PC_TABLE[i].ID].area_tbl[j].ID == n)
				{
					switch (command)
					{
					case CHANGE_IA2_DURATION_ITEM_AREA:
						{
							SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_DURATION);
							break;
						}
					case CHANGE_IA2_LIMIT_ITEM_AREA:
						{
							SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_LIMIT);
							break;
						}
					case CHANGE_IA2_ATTR_ITEM_AREA:
						{
							SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_ATTR);
							break;
						}
					case CHANGE_IA2_ID_ITEM_AREA:
						{
							SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_ID);
							break;
						}
					case CHANGE_IA2_RESERVED0_ITEM_AREA:
						{
							SendItemAttrChange( c, PC_TABLE[i].ID, n, IATTR_RESERVED0 );
							break;
						}
					case CHANGE_IA2_RESERVED1_ITEM_AREA:
						{
							SendItemAttrChange(c, PC_TABLE[i].ID, n, IATTR_RESERVED1);
							break;
						}
					case ITEM_EXPLOTION_AREA:
						{
							SendItemExplotion( PC_TABLE[i].ID, n );
							break;
						}
					}
				}
			}
		}
	}
	
	return 0;
}

int RemoveAllItem(t_connection c[], int n)
{
	for (int i = 0; i < PC_COUNT; ++i)
	{
		for (int j = 0; j < MAX_AREA_BUFFER; ++j)
		{
			if (c[PC_TABLE[i].ID].area_tbl[j].bAlive == TRUE)
			{
				if (c[PC_TABLE[i].ID].area_tbl[j].Type == 3 && c[PC_TABLE[i].ID].area_tbl[j].ID == n)
				{
					c[PC_TABLE[i].ID].area_tbl[j].bAlive = FALSE;
					SendRemoveArea(c, PC_TABLE[i].ID, 3, n);
				}
			}
		}
	}
	
	return 0;
}

int SetArea(int Cmd, int Id)
{
	if (CMD_AREA_COUNT >= MAX_CMD_AREA)
	{
		return -1;
	}

	CMD_AREA_TABLE[CMD_AREA_COUNT].Cmd = Cmd;
	CMD_AREA_TABLE[CMD_AREA_COUNT].ID  = Id;	
	++CMD_AREA_COUNT;
					
	return 1;
}

void RunArea(t_connection c[])
{	//< CSD-CN-031213
	PC_COUNT = 0;

	CUserManager::HASH_USER mpUser = g_pUserManager->GetUserSet();

	for (CUserManager::ITOR_USER i = mpUser.begin(); i != mpUser.end(); ++i)
	{
		const int idUser = i->second;
		CHARLIST* pUser = CheckServerId(idUser);

		if (pUser != NULL)
		{	
			PC_TABLE[PC_COUNT].ID = idUser;
			PC_TABLE[PC_COUNT].X = pUser->X;
			PC_TABLE[PC_COUNT].Y = pUser->Y;
			++PC_COUNT;
		}	
	}
			
	NPC_COUNT = 0;

	for (int j = NPC_LIST_START; j < MAX_NPC_LIST; ++j)
	{	// 绝绰 惑怕( REMOVE_)捞搁 寸楷洒 器窃且鞘夸 绝档 BUFE_惑怕 溜, 
		// 努扼捞攫飘俊辑 NPC啊 荤扼瘤绰 矫埃阑 父甸扁 困窃 Term阑 困秦 BUFE_惑怕肚茄 器窃茄促. 
		CHARLIST* pNpc = CheckNpcId(j);

		if (pNpc != NULL && pNpc->bAlive != REMOVE_ && pNpc->bAlive != BUFE_)
		{	
			NPC_TABLE[NPC_COUNT].ID = j;
			NPC_TABLE[NPC_COUNT].X	= pNpc->X;
			NPC_TABLE[NPC_COUNT].Y	= pNpc->Y;	
			++NPC_COUNT;
		}	
	}
				
	ITEM_COUNT = 0;
				
	for (int k = 0; k < MAX_ITEM_LIST; ++k)
	{		
		if (ItemList[k].bAlive == TRUE)
		{	
			ITEM_TABLE[ITEM_COUNT].ID = k;
			ITEM_TABLE[ITEM_COUNT].X = ItemList[k].x;
			ITEM_TABLE[ITEM_COUNT].Y = ItemList[k].y;
			++ITEM_COUNT;
		}	
	}		
				
	for (int l = 0; l < CMD_AREA_COUNT; ++l)
	{
		switch (CMD_AREA_TABLE[l].Cmd)
		{
		case ADD_PC_AREA:
			{
				CheckAreaAllPC(c, CMD_AREA_TABLE[l].ID);
				break;
			}
		case MOVE_PC_AREA:
			{
				CheckAreaAllPC(c, CMD_AREA_TABLE[l].ID);
				RemoveAreaAllPC(c, CMD_AREA_TABLE[l].ID);
				break;
			}
		case REMOVE_PC_AREA:
			{
				RemoveAllPC(c, CMD_AREA_TABLE[l].ID);
				break;
			}
		case ADD_NPC_AREA:
			{
				CheckAreaAllNPC(c, CMD_AREA_TABLE[l].ID);
				break;
			}
		case MOVE_NPC_AREA:
			{
				CheckAreaAllNPC(c, CMD_AREA_TABLE[l].ID);
				RemoveAreaAllNPC(c, CMD_AREA_TABLE[l].ID);
				break;
			}
		case REMOVE_NPC_AREA:
			{
				RemoveAllNPC(c, CMD_AREA_TABLE[l].ID);
				break;
			}
		case ADD_ITEM_AREA:
			{
				CheckAreaAllItem(c, CMD_AREA_TABLE[l].ID);
				break;
			}
		case CHANGE_IA2_DURATION_ITEM_AREA:
		case CHANGE_IA2_LIMIT_ITEM_AREA:
		case CHANGE_IA2_ATTR_ITEM_AREA:
		case CHANGE_IA2_ID_ITEM_AREA:
		case CHANGE_IA2_RESERVED0_ITEM_AREA:
		case CHANGE_IA2_RESERVED1_ITEM_AREA:
		case ITEM_EXPLOTION_AREA:
			{
				CommandAllItem(c, CMD_AREA_TABLE[l].ID, CMD_AREA_TABLE[l].Cmd);
				break;
			}
		case REMOVE_ITEM_AREA:
			{
				RemoveAllItem(c, CMD_AREA_TABLE[l].ID);
				break;
			}
		}
	}

	CMD_AREA_COUNT = 0;
}	//> CSD-CN-031213

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -