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

📄 npc_pattern.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			n->Gender = pNpcTable->Sel_gender - 1;		
			break;
		}
	case 0:
	case 3: 
		{
			n->Gender = ran(2);				
			break;
		}
	}
	
	if (pNpcTable->nNpcRace == SEALSTONE)	
	{	// LTS NEW LOCALWAR
		if (g_pLocalWarfield != NULL)
		{
			g_pLocalWarfield->CheckSealStonePtr(n);
		}
	}
	
	n->MoveSx = x;
	n->MoveSy = y;
	SetTileOccupied(n->MoveSx, n->MoveSy, false);
	
	n->OldMoveSx = n->MoveSx;
	n->OldMoveSy = n->MoveSy;
	n->X = n->MoveGox = n->MoveSx*TILE_SIZE + 16;
	n->Y = n->MoveGoy = n->MoveSy*TILE_SIZE + 16;
	n->ox = n->X;
	n->oy = n->Y;
	n->MoveP = pNpcTable->Movp + (rand()%20); // 捞悼仿 // LTS AI
	n->MovePathCount = 0;
	n->MoveType	= 0;
	
	int amount = 0;
	n->Get_meat	= pNpcTable->Get_meat;
	
	amount = pNpcTable->Meat_amount;	
	
	if (rand()%6)
	{ 
		amount = (amount) ? (rand()%amount + 1):0; 
	}
	else 
	{
		amount = 0; 
	}
	
	n->Meat_amount = amount;
	n->Get_skin = pNpcTable->Get_skin;
	
	amount = pNpcTable->Skin_amount;	
	
	if (rand()%3)
	{ 
		amount = (amount) ? (rand()%amount + 1):0; 
	}
	else 
	{
		amount = 0; 
	}
	
	n->Skin_amount = amount;
	n->Get_Wool	= pNpcTable->Get_Wool;
	
	amount = pNpcTable->Wool_amount;
	
	if (rand()%3)
	{ 
		amount = (amount) ? (rand()%amount + 1):0;
	}
	else 
	{ 
		amount = 0; 
	}
	
	n->Wool_amount = amount;
	n->Get_beewax = pNpcTable->Get_beewax;
	
	amount = pNpcTable->BeeWax_amount;	
	
	if (rand()%3)
	{ 
		amount = (amount) ? (rand()%amount + 1):0; 
	}
	else 
	{ 
		amount = 0; 
	}
	
	n->BeeWax_amount = amount;
	// NPC阑 磷菌阑 锭 掘阑 荐 乐绰 酒捞袍 汲沥
	if (!g_pArenaManager->IsColossusArena())
	{	//< CSD-030516
		SkillMgr.GenerateNPCItem2(n, pNpcTable);
	}	//> CSD-030516
	// 鸥捞怪 阁胶磐 沥焊
	n->targetid	= -1;
	n->attacked	= -1;
	n->WalkTime	= global_time;
	n->aitimedelay = 0;
	n->tame	= 0;
	n->tamingcountdown = 0;
	n->tamingable = pNpcTable->Tamingable;
	// A.I Pattern汲沥秦林绰镑
	n->ChairNum = (generationtype == GT_SKILL_SUMMON) ? 0:pNpcTable->nAIType; // LTS AI AI 且寸阑 包府茄促. 0: 努扼捞攫飘 1 : 辑滚
	n->patterntype = pNpcTable->nAIBase;
	
	if (n->ChairNum != 0) // LTS NEW AI
	{	//< CSD-030417
		if (pNpcTable->nAppearType > 0) 
		{ 
			n->CurrentPhase = pNpcTable->nAppearType;	
		}
		
		n->patterntype = g_pAIManager->GetNpcAIData(pNpcTable->nAINo, FSTART_AI_PATTERN);
	}	//> CSD-030417
	
	n->JoinLocalWar = GroupNo; // LTS AI2
	n->GainedFame = isBoss;    // LTS AI2
	n->ctrlpc = -1;
	n->bAlive = ALIVE_;
	++CurrentNPCNo;
	// 010301 KHS
	switch (n->generationtype)	
	{		
	case GT_SKB_FILE:
		{
			if (generationpos >= 0 || generationpos < NPCgeneratePositionMax)
			{
				NPCgeneratePosition[generationpos].curnpc++;
			}
			
			break;				
		}
	case GT_SCRIPT:	        
	case GT_SKILL_SUMMON:
		{
			break;
		}
	}		
	
	SetArea(ADD_NPC_AREA, Num);
	Send_CMD_SEALSTONE_STATUS(n, 1);
	return 1;		
}	//> CSD-030408

int NPC_AdjustPosition(int sprno, int* x, int* y)
{	//< CSD-030408
	switch (sprno)	
	{	// Dummy NPC肺辑
	case 92: 
	case 93: 
	case 94: 
	case 95: return 1;
	}
	
	int ax = *x;
	int ay = *y;
	
	const int maxx = 3;
	const int maxy = 3;
	
	for (int i = 0; i < maxx; ++i)
	{
		for (int j =  0; j < maxy; ++j)
		{	
			if (FreeTile(NULL, ax + i, ay + j, ax + i, ay + j)) 
			{
				*x = ax + i;
				*y = ay + j;
				return 1; 
			}
			
			if (FreeTile(NULL, ax + i, ay - j, ax + i, ay + j)) 
			{	
				*x = ax + i;
				*y = ay - j;	
				return 1; 
			}
			
			if (FreeTile(NULL, ax - i, ay + j, ax + i, ay + j))
			{	
				*x = ax - i;
				*y = ay + j;	
				return 1; 
			}
			
			if (FreeTile(NULL, ax - i, ay - j, ax + i, ay + j)) 
			{	
				*x = ax - i;
				*y = ay - j;	
				return 1; 
			}
		}				
	}	
	
	return 0;		
}	//> CSD-030408	

void NPC_AutoCreationProc(  void )
{	
	int id;	
	int x, y;
	sNPCgeneratePosition *gpos;
	int i;		
	static int MaxNPC;
	
	static DWORD checktime;
	
	if( global_time - checktime > 10000  )	// 10檬付促 
	{				
		checktime = global_time;
		
		for( i = 0 ; i < NPCgeneratePositionMax ; i ++)
		{			
			if(NPCgeneratePosition[i].maxno > NPCgeneratePosition[i].curnpc ) // 茄疙父 惯积矫挪促. 溜, Event侩捞鄂娟扁.. 
			{				
				gpos = &NPCgeneratePosition[i];
				if( gpos->curnpc < gpos->maxno )
				{			
					if( gpos->maxno > 1 )
					{		
						x = gpos->x -3 + (rand()%7);
						y = gpos->y -3 + (rand()%7);
					}		
					else	
					{		
						x = gpos->x;
						y = gpos->y;
					}		
					
					id	= GetAliveNPCList();
					
					if( id >= 0 )
					{
						if( NPC_AdjustPosition( gpos->npcindex, &x, &y ) )
						{	
							NPC_Create( id, gpos->npcindex, x, y, gpos->eventno, i, GT_SKB_FILE );
							
						}
					}
				}
			}
		}	
		return;
	}				
	
	return;
}	


void NPC_AutoCreationProc2()						// LTS AI2
{
	static DWORD checktime;
	int x,y;		
	int NPC_ID;
	
	if( global_time - checktime < 10000  )	return;			
	else checktime = global_time;
	
	for (int j=0;j<MAX_GROUP_NO;j++)			// 弊缝 贸澜何磐 场鳖瘤 捣促.
	{
		int tempStatus=g_pAdventManager->GetActiveStatusByIndex(j);
		if (tempStatus>0)				// 秦寸 弊缝狼 牢郸胶 锅龋啊 绝促.
		{
			for (int i=0;i< g_pAdventManager->GetDataCountByIndex(j);i++)		// 弊缝单捞磐狼 场鳖瘤 埃促.
			{
				NPCGenerationPos* Pos=NULL;
				Pos=g_pAdventManager->GetGenerationPosByIndex(j,i);
				if (!Pos) return;
				if (Pos->MaxNo>Pos->CurNPC)						//积己登瘤 臼篮 NPC啊 乐促.
				{
					if (Pos->MaxNo>1)
					{
						x = Pos->LocationX -3 + (rand()%7);
						y = Pos->LocationY -3 + (rand()%7);
					}
					else
					{
						x = Pos->LocationX;
						y = Pos->LocationY;
					}
					NPC_ID	= GetAliveNPCList();
					if( NPC_ID >= 0 )
						if( NPC_AdjustPosition( Pos->NPCNo, &x, &y ) )
						{	
							NPC_Create(NPC_ID,Pos->NPCNo, x, y,Pos->EventNo, i, GT_EVENT_MONSTER,j,Pos->isBoss );
							Pos->CurNPC++;
							MyLog(0,"NPC SPECIAL ID:%d, No:%d, x:%d, y:%d, event:%d, i:%d, Group:%d, GTType:%d",NPC_ID,Pos->NPCNo, x, y,Pos->EventNo, i, j,GT_EVENT_MONSTER);
						}
				}
			}
		}
	}
}

void NPC_AutoCreate()		// LTS AI2
{	//< CSD-030509
	NPC_AutoCreationProc();
	NPC_AutoCreationProc2(); // 捞亥飘 阁胶磐 殿厘
	// 荤成 阁胶磐 殿厘
	if (!g_pArenaManager->IsColossusArena())
	{
		g_pRegenManager->Regenerate(); 
	}
}	//> CSD-030509

//---------------------------------------------------------------------------------		
//	矫埃捞 DEAD_CHARACTER_CHECK_TIME捞 版苞窍搁 .bAlive啊 DEAD_登绢 乐绰 Character甫 REMOVE_矫挪促. 
//	NPC老版快 ITEM阑 积己矫挪促. 
//	葛电 NPC/PC狼 磷澜篮 咯扁辑 贸府茄促. 
//-----------------------------------------------------------------------------------
void NPC_CheckRemove( void )
{		
	static DWORD time;
	int i;	
	CHARLIST *ch;
	
	if( g_curr_time - time < DEAD_CHARACTER_CHECK_TIME ) return;
	time = g_curr_time;	
	
	for( i = NPC_LIST_START ; i < MAX_NPC_LIST ; i ++)
	{				
		if( NPCList[i].bAlive >= DEAD_ )
			if( NPCList[i].deadcount > 1 )
			{				
				ch = NPCList + i;
				ch->deadcount--;
				if( ch->deadcount == DEAD_NPC_COUNT_BOTTOM_ )	// Client俊霸辑 Remove矫挪促. 
				{		
					if( ( ch->eventno>0 && ch->Race==HUMAN ) || ( ch->Race ==  SEALSTONE ) )// 捞亥飘甫 啊瘤绊 乐绰 仇捞搁 ..
					{	
						ch->deadcount	=       0;
						ch->Peacests = 0;
						ch->OldMoveSx = ch->MoveSx = ch->X		=	ch->homex;
						ch->OldMoveSy = ch->MoveSy = ch->Y		=	ch->homey;
						ch->X *= TILE_SIZE;
						ch->Y *= TILE_SIZE;
						
						// 020701 YGI
						ch->Hp		= ch->HpMax;
						ch->Hungry  = ch->HungryMax;
						ch->Mana	= ch->ManaMax;
						ch->bAlive = ALIVE_;		// 020716 YGI
						
						SetArea( MOVE_NPC_AREA, i);
						//SkillMgr.CharacterToAlive(ch);//促矫 混赴促
						continue;
					}
					
					SetArea( REMOVE_NPC_AREA, i);
					// Client俊辑 荤扼瘤绰 矫埃阑 国扁困窃...
					// Client俊辑 荤扼瘤绰 悼救 弊困摹俊辑 积扁搁 救登扁 锭巩.
					NPCList[i].bAlive = BUFE_;
				}
				else if( ch->deadcount <= 1 )	// Server俊技档 Remove矫挪促. 
				{
					ch->deadcount = 0;
					RemoveNPCList( i );
				}
			}
			// Remove Process....
	}
	
	for( i = DRAGON_CONNECTIONS_START ; i < DRAGON_MAX_CONNECTIONS ; i ++)
	{				
		if( connections[i].dwAgentConnectionIndex && connections[i].state >= CONNECT_JOIN )
			if( connections[i].chrlst.bAlive >= DEAD_ )
				if( connections[i].chrlst.deadcount >= DEAD_PC_COUNT_BOTTOM_ ) 
				{		
					ch = &connections[i].chrlst;
					ch->deadcount --;
					
					if( ch->deadcount < DEAD_PC_COUNT_BOTTOM_ ) //  磷篮第 Ghost肺 函茄促. 
					{	
						RareEM.ClearDynamicRareEffect(ch); //蜡飞捞 登菌阑锭 努府绢 扁瓷酒捞袍 努府绢
						
						// 031009 YGI	// 酒饭唱俊辑绰 烹窍瘤 臼绰促. // 归捍傈 吝老订 烹窍瘤 臼绰促.
						extern bool CanUseRevivalPosion();
						if( CanUseRevivalPosion() && !g_pArenaManager->GetArenaInfo( GetOwnPort() ) && RareEM.IsHaveRivaval(ch) )//狞芒阑 倒绊辑 混府绰 酒捞袍捞 乐栏搁 混妨霖促 // 何劝狼 郡腐辑
						{	
							SkillMgr.CharacterToAlive(ch, 1);
						}
						else
						{
							SkillMgr.CharacterToGhost(ch);
						}
						// 某腐磐 付过沥焊 檬扁拳  
						ch->Clear();
					}
				}
	}
}	

void RecvCMD_MODIFY_POSITION(  int cn,  t_client_modify_position *p )
{	
	if( cn < DRAGON_CONNECTIONS_START || cn >= DRAGON_MAX_CONNECTIONS  ) return;
	LPCHARLIST ch = &connections[ cn].chrlst;
	//< CSD-021114
	ch->X = ch->MoveGox = p->x;
	ch->Y = ch->MoveGoy = p->y;
	//> CSD-021114
	ch->MoveSx = p->x / TILE_SIZE;
	ch->MoveSy = p->y / TILE_SIZE;
	
	ch->MovePathCount = ch->MoveLength = 0;
	
	SetArea(MOVE_PC_AREA, cn );
}	





/* ///////////////////////////////////////////////////////////////////////////////////////

  CMD_ALL_READY啊 坷搁 圾青茄促. 
  CMD_NPC_ADD甫 焊郴变 沁瘤父  Client俊辑 Data Loading窍蠢衬绊 矫埃阑 棱酒冈菌促.
  
////////////////////////////////////////////////////////////////////////////////////////  */
void SendReadyMoveDate( int cn )
{
	AREA *a =  connections[cn].area_tbl;
	int id;
	t_packet packet;
	
	for( int i = 0 ; i <  MAX_AREA_BUFFER ; i ++)
	{
		if( a[i].bAlive )
		{
			switch( a[i].Type )
			{
				// PC
			case 1: id = a[i].ID;
				if( connections[ id].chrlst.MovePathCount )// 泅犁 捞悼窍绊 乐绰 吝捞搁....
				{
					if( SettingMoveData_( id, &connections[id].chrlst, &packet ) )
					{
						packet.u.server_move.movetype += 100;	// 咯扁辑 焊郴林绰 困摹俊辑 矫累茄促. 
						packet.h.header.type = CMD_MOVE;
						QueuePacket( connections, cn, &packet, 1);
					}
				}
				else
				{
					packet.h.header.type = CMD_MODIFY_POSITION_ABSOLUTE;
					{
						packet.u.server_modify_position_absolute.id = id;
						packet.u.server_modify_position_absolute.x  = connections[id].chrlst.X;
						packet.u.server_modify_position_absolute.y  = connections[id].chrlst.Y;
					}
					packet.h.header.size = sizeof( t_server_modify_position_absolute );
					QueuePacket( connections, cn, &packet, 1);
				}
				
				break;
			case 2:	id = a[i].ID;
				if( NPCList[id].MovePathCount )// 泅犁 捞悼窍绊 乐绰 吝捞搁....
				{
					if( SettingMoveData_( id + 10000, &NPCList[id], &packet ))
					{
						packet.u.server_move.movetype += 100;	// 咯扁辑 焊郴林绰 困摹俊辑 矫累茄促. 
						packet.h.header.type = CMD_MOVE;
						QueuePacket(connections, cn, &packet, 1);
					}
				}
				else 
				{
					packet.h.header.type = CMD_MODIFY_POSITION_ABSOLUTE;
					{
						packet.u.server_modify_position_absolute.id = id+10000;
						packet.u.server_modify_position_absolute.x = NPCList[id].X;
						packet.u.server_modify_position_absolute.y = NPCList[id].Y;
					}
					packet.h.header.size = sizeof( t_server_modify_position_absolute );
					QueuePacket( connections, cn, &packet, 1);
				}
				break;
			}
		}
	}
	
	
	
}	




#define TAME_FAIL_CHANGE_NAME		0 // 捞抚官操扁甫  角菩. 
#define TAME_NO_CHAR				1 // 弊繁捞抚栏肺 辨甸牢 悼拱捞 绝嚼聪促.  
#define TAME_NO_NAME_CHAR			2 // 弊繁 捞抚阑 啊柳 措惑捞 绝嚼聪促. 
#define TAME_FOLLOW					3 // 蝶扼癌聪促. 
#define TAME_STOP					4 // 肛苗 挤聪促. 
#define TAME_ATTACK					5 // 傍拜钦聪促. 
#define TAME_SUCCESS_CHANGE_NAME	6 // 捞抚阑 官操菌嚼聪促. 


void RecvTameCommand( int cn, t_tame_command *p )
{
	int i;
	CHARLIST *n, *ch;
	t_packet packet;
	
	p->mybaby[19] = 0;
	if( p->mybaby[0] == 0 ) { SendTameResult( cn, TAME_NO_CHAR ) ; return; }
	p->toname[19] = 0;
	
	for( i = NPC_LIST_START ; i < MAX_NPC_LIST ; i ++ )
	{
		if( NPCList[i].bAlive == ALIVE_ )
		{
			if( strcmp(NPCList[i].Name, p->mybaby ) == 0 )
			{
				n = &NPCList[i];
				break;					
			}
		}
	}
	if( i == MAX_NPC_LIST ) { SendTameResult( cn, TAME_NO_CHAR ) ; return;  }	
	// 弊绰 辨甸牢 悼拱捞 酒聪菌促. 
	if (n->IsTamedNpc() == false)  { SendTameResult(cn, TAME_NO_CHAR); return; }
	// 寸脚捞 林牢捞 酒聪促. 
	if( strcmp( n->HostName, connections[cn].chrlst.Name)) {SendTameResult( cn, TAME_NO_CHAR ) ; return; }
	
	switch( p->cmd )						
	{										
	case LC_TAME_NAME :			if( p->toname[0] == 0 ) return;
		strcpy( n->Name, p->toname );
		packet.h.header.type = CMD_TAME_NAME_CHANGE;
		packet.u.tame_name_change.id = i + 10000;
		strcpy( packet.u.tame_name_change.name, n->Name );
		packet.h.header.size = sizeof( t_tame_name_change );
		CastNPC2Other( i, &packet );
		break;						
		
		
	case LC_TAME_ATTACK :		
		if( p->toname[0] == 0 )	

⌨️ 快捷键说明

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