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

📄 network.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	
	connections.receive=1;
}	
	
void RecvAssignServerID( t_server_assign_server_id *p )
{	
	HeroServerID = Hero->id = p->server_id;
}	

void SendLogOut( void )
{						
	t_packet packet;
	packet.h.header.type = CMD_LOST_CONNECTION;
	packet.h.header.size = 0;
	QueuePacket( &packet, 1 );
					
	HandleRunning(&connections);
}

void SendEvent(int type, int id)
{	//< CSD-030930
	if (EVENT_TYPE_NPC == type)
	{	
		LPCHARACTER pNpc = ReturnCharacterPoint(id);
		if (pNpc == NULL)
		{
			return;
		}

		if (pNpc->sealstone)
		{
			return;
		}

		switch (pNpc->nRace)
		{
		case HUMAN:
		case GUARD:
			{	
				t_packet packet;
				packet.h.header.type = CMD_EVENT;
				packet.h.header.size = sizeof(t_client_event);
				packet.u.client_event.type = type;
				packet.u.client_event.event_no = id;		
				QueuePacket(&packet, 1);
				break;
			}	
		}

		return;
	}	

	if (g_pArenaManager->IsReadyGame())
	{
		return;
	}

	t_packet packet;
	packet.h.header.type = CMD_EVENT;
	packet.h.header.size = sizeof(t_client_event);
	packet.u.client_event.type = type;
	packet.u.client_event.event_no = id;		
	QueuePacket(&packet, 1);
}	//> CSD-030930

void RequestData( int server_id, int protocol )
{	
	t_packet p;
	
	return;////
	
	switch( protocol )
	{
		case REQ_NPC_ADD :	p.h.header.type = protocol;
							p.u.req_npc_add.server_id = server_id;
							p.h.header.size = 0;
							QueuePacket( &p, 1 );
			break;
		case REQ_ITEM_ADD :	p.h.header.type = protocol;
							p.u.req_item_add.server_id = server_id;
							p.h.header.size = 0;
							QueuePacket( &p, 1 );
			break;
		case REQ_PC_ADD :	p.h.header.type = protocol;
							p.u.req_pc_add.server_id = server_id;
							p.h.header.size = 0;
							QueuePacket( &p, 1 );
			break;
	}
}	
	
int DoAccessJoin( void )//bIsMapMove 啊 true搁 甘捞悼阑 矫档 窍绰 巴 false 搁 弥檬俊 竣技胶甫 矫档窍绰巴
{
	if( SysInfo.notconectserver ){ return 0; }

	t_packet packet;
	DWORD StartTime = timeGetTime( );	

	packet.h.header.type = CMD_ACCESS_JOIN;

	ACCESSJOIN *pAJ = &packet.u.AccessJoin;

	memcpy( pAJ->id, IIDD, ID_LENGTH );
	memcpy( pAJ->pw, PPWW, PW_LENGTH );
	memcpy( pAJ->name, HeroName, NM_LENGTH );
	pAJ->startposition = StartPosition;
	pAJ->nBillingType = ((g_nBillingType == BT_FREE)?BT_FREE:1000);

	packet.h.header.size = sizeof( ACCESSJOIN );
	QueuePacket( &packet, 1 );
						
	ListenCommand = CMD_NONE;
	while ( 1 )	
	{			
		DWORD Duration = timeGetTime();
								
		if ( Duration - StartTime > WAIT_TIME_RESPONSE_DURATION  ) // 030930 kyo
		{		
			return(-1);
		}		
				
		if ( ::HandleRunning(&connections )  <= 0 )
		{		
			Release(&connections );
			return(-2);
		}		
		else	
		{								
			switch( ListenCommand )		
			{							
			case  CMD_ACCEPT_JOIN	:	
				return 1;				
			case  CMD_INVALID_ID	:	
				return -3;				
			case  CMD_INVALID_PW	:	
				return -4;				
			case  CMD_INVALID_DB	:	
				return -5;				
			case  CMD_INVALID_VERSION : 
				return -6;				
			case  CMD_USED_ID		:	
				return -7;
			case CMD_INVALID_AGE	: // 030929 kyo
				return -17;
			}
		}
	}	
	return 1;
}
				
//021030 YGI				
int RecvConnectInfo( t_server_connect_info *p )
{		
	k_server_connect_info_kein *pData = (k_server_connect_info_kein *)p;
	StartPosition = p->startposition;
	if( SysInfo.notconectserver == 0  && SysInfo.entergameserver )
	{	
		g_GameInfo.map_port = SysInfo.port;
	}	
	else
	{	
		g_GameInfo.map_port = p->port;
	}

	RecvEventObject( &pData->data2 );

	int ret = ::DoAccessJoin();
	if( ret <= 0 ) 
	{	
		JustMsg( "Game Server Connecting Failed \n Now Exit.( Error Code: %d )", ret );//lsw
		ExitApplication(EA_RECV_CONNECT_INFO);
		return 0;
	}	
	return 1;
}				

int RecvChangeMap( t_server_change_map *p )		// 0918	// 0923 YGI
{			
	MSG msg;
	int c = 0;
			
	ChangeMapFlag = 0;
	NowLoading = 1;
	StartPosition = 0;	//  贸澜俊 甸绢啊搁 惯积窍绰 困瞒.... 99捞搁 LogOut等 困摹俊 唱鸥抄促.
	CrackMgr.InitCrackMgr();//020505 lsw
	InitHeroCanView();	//020510 lsw
	pMusic->Stop();
	g_GameInfo.map_port = p->port;
	HeroServerID = Hero->id = p->server_id;

	SetChangeMapOfMenu();

	while( 1 )
	{		
		if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE ))//PM_NOREMOVE
		{
			if (!GetMessage(&msg, NULL, 0, 0 )){break;}
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else
		{

			if( g_DirectDrawInfo.lpDirectDrawSurfaceBack )
			{
				g_DestBackBuf = GetSurfacePointer( g_DirectDrawInfo.lpDirectDrawSurfaceBack );
				SettingChangMapMenu( c ); 
				FlipScreen( &g_DirectDrawInfo );
			}
							
			g_nLButtonState = 0; g_nRButtonState   = 0;
			g_nLDButtonState = 0; g_nRDButtonState = 0;
			ResetEffect(Hero);
//<soto-030626
			g_mgrBattle.ClearDelay(); // CSD-TW-030624
			g_mgrBattle.ClearSwitchDelay(); // CSD-TW-030624
//>soto-030626
			g_mgrBattle.SendCombatClear();

			switch( c )			
			{
			case 0:{ g_Volume_Off=1; c = 20;}break;
			case 20 :
				{
					DeleteAllSkillData();
					LoadingLoadMaskTable();
					ResetCharacter(Hero);
					InitHpUpDown();
					c = 40;
				}break;
			case 40 : 	
				{
					strcpy( MapName, p->mapname );
					Hero->position.x = p->x;
					Hero->position.y = p->y;
					Hero->x = Hero->gox = p->x * TILE_SIZE + 16;
					Hero->y = Hero->goy = p->y * TILE_SIZE + 16;
					Hero->pathcount = 0;
					Hero->moveFlag  = 0;
					c+= 10;
				}break;
			case 50 : 	{FreeTOI();													c+= 10;	}break;
			case 60 : 	{LoadTOI( MapName );			StopBGE();					c+= 10;	}break;
			case 70 : 	{MapBuild( &g_Map, MapName );								c+= 10;	}break;
			case 80 : 	{DestroyRoofHeader( &g_RoofHeader );						c+= 10;	}break;
			case 90 : 	{BuildRoofHeader( &g_RoofHeader, MapName );					c+= 10;	}break;
			case 100 : 	{DestroyEventList();										c+= 10;	}break;
			case 110 : 	{BuildEventList( MapName );									c+= 10;	}break;
			case 120 : 	{FreeMapSource();											c+= 10;	}break;
			case 130 : 	{LoadMapSource2( MapName );									c+= 10;	}break;
			case 140 : 	{DestroyItemList();											c+= 10;	}break;
			case 150 : 	{FreeCharacterSpriteDataAll( 2, MAX_CHARACTER_SPRITE_ );	c+= 10;	}break;
			case 160 : 	{DestroyCharacterListExceptHero();							c= 200;	}break;
			case 200 : 	//////////////// 0812 lkh 荐沥 ////////////////
				{
					g_Volume_Off=0;
					SetVolumeMusic(system_info.music);
					BackgroundMusic();

					Hero->position.x = p->x;		//弥檬狼 甘狼 困摹福 富窃...
					Hero->position.y = p->y;
					Hero->x = Hero->gox = p->x * TILE_SIZE + 16;
					Hero->y = Hero->goy = p->y * TILE_SIZE + 16;
					StartSetView( Hero );
					Hero->pathcount = 0;
					Hero->moveFlag  = 0;
					c+= 10;		
				}break;
			case 210 :
				{
					SendAllReady();
					ProtocolProc( &connections );
					c+= 10;		
				}break;
			default : 
				{
					goto SUCCESS_;
				}break;
			}
		}
	}

SUCCESS_:
	g_SmallMapNumber = MapNumber;
	
	if( IsReporterMode() )
	{
		Hero->reporter_mode = 0;
		CallServer( CMD_PLEASE_GIVE_LIFE1 );
	}

	NowLoading = 0;	
	g_Menu_Variable.clear3();
	if( g_Menu_Variable.m_PartySelect )
	{
		SendSelectPartyExp( g_Menu_Variable.m_PartySelect );
	}

	// 020925 YGI
	if(GetBattlePeace() == PK_MODE )
	{
		char pk_data = 1;
		CallServer( CMD_PK_ON_OFF, &pk_data, 1 );
	}
	CheckRoof();	// 趣矫 瘤贺捞 摧媚 乐栏搁 凯磊.	// 031110 YGI

	g_FrameMgr.InitTime(); // CSD-030723
	return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////////




// #define STATUS_PEACE_BATTLE	0
void SendPeaceBattle( LPCHARACTER ch )
{	
	t_packet p;
	
	switch( ch->peacests )
	{
	case 0 : 	p.h.header.type = CMD_INTERFACE_PEACE;	break;
	case 1 : 	p.h.header.type = CMD_INTERFACE_BATTLE;	break;
	}
	
	p.h.header.size = 0;
	QueuePacket( &p, 1 );
}	
	
	
void RecvPeaceBattle( int server_id, int peacests )
{	
	LPCHARACTER ch = FindCharacter( &g_CharacterList, server_id );
	if( ch == NULL ) return;
	
	ch->peacests = peacests;
	SettingBasicActionSub( ch );
}	
	
void RecvCharInfoMagic( t_char_info_magic *p )
{	
	memcpy( SCharacterData.MagicId, p->magic, 200 );	// #### 1102
	ReadMagicTable();	// 概流 抛捞喉阑 啊廉柯促.	// 0711 YGI
	ResetMagicQuickArray( );		// 概流 硅凯 檬扁拳		
	if( SCharacterData.nCharacterData[SPELL] == PRIEST_SPELL ) MagicSetting2();			// 盔贰~ 橇府胶飘 版快...
	if( g_StartMenuOn ) ReqConnectInfo();			// 胶懦篮 甘俊辑 罐酒柯促.
}	
	
void RecvCharInfoSkill( t_char_info_skill *p )
{	
	memcpy( SCharacterData.SkillId, p->skill, 200 );	// #### 1102
	//if( g_StartMenuOn ) ReqConnectInfo();		//021030 YGI // ReqConnectInfo()甫 酒抗 昏力 茄促.
}	

void RecvItemDurationChange( t_item_duration_change *p )
{	
	ItemAttr *target_item = &EquipItemAttr[ p->pos];
	WORD dur, max;
	char temp[MAX_PATH];
	
	if( p->pos >= 8 )				return;
	if( target_item == NULL )		return;
	if( target_item->item_no == 0 ) return;
	
	CItem *ii = ItemUnit( target_item->item_no / 1000, target_item->item_no %1000 );
	if( ii == NULL ) return;
	//char *s = ii->GetItemName();
	char *s = ii->GetItemHanName();		// 0721 YGI
	
	GetItemDuration( *target_item, dur, max );
	
	if( ii->GetRButton() == DIVIDE_ITEM )
	{
		dur = p->dur;
		if( dur < 10 )
		{
			sprintf( temp, lan->OutputMessage(4,1), s, dur );//lsw
			AddCurrentStatusMessage( 0,0,255, temp );
		}
		target_item->attr[IATTR_DURATION] = MAKELONG( dur, max );
	}
	else
	{
		dur  = p->dur;
		if( dur >= max ) return;
		target_item->attr[IATTR_DURATION] = MAKELONG( dur, max );

		// 郴备档啊 20%捞窍搁 舅恩...
		if( max * 20 / 100 > dur && dur/10 )
		{
			sprintf( temp, lan->OutputMessage(4,2), s );//lsw
		}
		else
		if( dur/10 == 0 )  // 酒捞袍粮犁甫 绝矩促. 
		{
			if( ii )
			{
				ii->ReleaseItem();
				if( s )
				{
					sprintf( temp, lan->OutputMessage(4,3), s );//lsw
					AddCurrentStatusMessage( 0,0,255, temp );
		
					ChangeEquip( Hero, target_item, p->pos ); //  8俺..
				}
			
				DeleteItem( target_item );
			}
		}

	}

}

int QueuePacket( t_packet *packet, int type )
{		
	t_packet	*tempbuf;
		
	if ( packet == NULL || packet->h.header.size > MAX_PACKET_SIZE 
		|| 0 > packet->h.header.size)//0焊促 累栏搁 府畔
	{//021025 lsw
		return( 0 );
	}	
		
	if ( type == 0 )	// inbuf
	{	
		if( packet->h.header.type < 0 ) 
		{
			_asm nop;
		}
		
		if ( !connections.inbuf )
		{
			connections.inbuf = ( t_packet* )malloc( sizeof( t_packet ) );
			memcpy( connections.inbuf, packet, sizeof( t_packet ) );
			connections.inbuf->next = NULL;
		}
		else 
		{
			for ( tempbuf = connections.inbuf; tempbuf->next; tempbuf = tempbuf->next )
			{
				;
			}

			tempbuf->next = ( t_packet* )malloc( sizeof( t_packet ) );
			tempbuf = tempbuf->next;
			memcpy( tempbuf, packet, sizeof( t_packet ) );
			tempbuf->next = NULL;
		}
	}	
	else if ( type == 1 )	// outbuf
	{	
		//---------------------------------------------------------
		if ( !connections.outbuf )
		{		
			connections.outbuf = ( t_packet* )malloc( sizeof( t_packet ) );
			memcpy( connections.outbuf, packet, sizeof( t_packet ) );
			connections.outbuf->next = NULL;
		}		
		else	
		{		
			for ( tempbuf = connections.outbuf; tempbuf->next; tempbuf = tempbuf->next )
			{	
				;
			}	
			tempbuf->next = ( t_packet* )malloc( sizeof( t_packet ) );
			tempbuf = tempbuf->next;
			memcpy( tempbuf, packet, sizeof( t_packet ) );
			tempbuf->next = NULL;
		}
	}
	
	connections.packet_count[ type ]++;
	
	return( 1 );
};	


void LogPacket(const bool bIsRecv,t_packet *p)
{
#ifdef _DEBUG	
	if( GetSysInfo( SI_GAME_MAKE_MODE ) )
	{
		struct tm *today;
		time_t lTime;
		time( 

⌨️ 快捷键说明

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