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

📄 network.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*****************************************************************************\
* Copyright (c), Future Entertainment World / Seoul, Republic of Korea        *
* All Rights Reserved.                                                        *
*                                                                             *
* This document contains proprietary and confidential information.  No        *
* parts of this document or the computer program it embodies may be in        *
* any way copied, duplicated, reproduced, translated into a different         *
* programming language, or distributed to any person, company, or             *
* corporation without the prior written consent of Future Entertainment World *
\*****************************************************************************/
																	
#include "stdafx.h"																	
#include "String.h"
#include <stdlib.h>//010707 lsw
#include "mmsystem.h"														
#include "Dragon.h"	
#include "network.h"																	
#include "char.h"
#include "chat.h"
#include "Hong_Sprite.h"														
#include "Hong_Sub.h"														
#include "CharDataTable.h"													
#include "Path.h"																
#include "Hong_Light.h"
#include "Effect.h"
#include "DirectSound.h"
#include "Map.h"
#include "Object.h"
#include "Menu.H"
#include "GameProc.h"
#include "SmallMenu.h"
#include "Tool.h"
#include "Skill.h"
#include "Item.h"
#include "House.h"
#include "LineCommand.h"
#include "NPC_Pattern.h"
#include "mousecursor.h"
#include "SkillTool.h"
#include "SealStone.h"
#include "Music.h"
#include "CReadArgument.h"
#include "Horse.h"				// LTS HORSERIDER
#include "CMessage.h"	// 030325 kyo 怕惫 苞陛 皋矫瘤
#include "MenuSet.h"
#include "SymbolMgr_Client.h" //soto-1.02
#include "LottoMgr.h"
#include "FrameMgr.h"
#include "ArenaManager.h"

extern CSymbolMgr_Client	g_SymBolMgr;//soto-1.02

enum eBillingType//-蔼栏肺 备己 秦具 钦聪促. CheckPW_TotalDB_SQL捞 巢篮 朝楼(剧荐)甫 府畔窍扁 锭巩涝聪促.
{//MapServer客 亲惑 悼扁拳 矫虐绞矫夸
	BT_WRONG_ID					= -1,//ID 撇覆
	BT_WRONG_PW					= -2,//PW 撇覆

	BT_NEED_PAY					= -3,//捣 何练

	BT_COMMERCIAL_TIME_REMAIN	= -4,//巢篮 矫埃 乐绰仇
	BT_COMMERCIAL_IP			= -20,//IP 辆樊力
	BT_FREE						= -100,//傍楼
	BT_WAIT_BILLING_MSG			= -200,//措父 鞍篮 镑狼 贸府 规侥 呼傅阑 扁促府档废 贸府
};

CHSEL_STREAM	en;
CHSEL_STREAM	de;
//011121 lsw <
bool g_bLogOnFlag = false;
short g_nBillingType =0;//呼傅 规侥阑 历厘 钦聪促. 剧荐绰 割老 荤侩扁埃捞 巢疽绰啊甫 狼固钦聪促.

DWORD ServerAccelTime = timeGetTime();
DWORD g_ClientTime_accel = timeGetTime();
DWORD	g_ClientTimeNoGap;

extern int g_SmallMapNumber;

class CGuardianGuild;
CGuardianGuild	g_CGuardianGuild; // 瘤虐固 辨靛 包府 傈开 努贰胶.

DWORD g_ping_delay = 0;
DWORD g_ping_time  = 0;

int NPCCOUNT;

extern int HandleCommand3( t_packet &packet, t_connection *c);	// 021023 kyo 
extern short int g_RealDate;		
extern bool g_bStopWeatherSystem; // CSD-CN-031215
extern bool g_bOffWeatherSystem; // CSD-CN-031217

///////////////////////////////////////////////////////////////////////////////
// global variables

t_connection	connections;

DWORD			global_time;
DWORD			alive_time;

int				ListenCommand;
int				HeroServerID;


char			HeroName[ NM_LENGTH];

///////////////////////////////////////////////////////////////////////////////
// function prototypes.
	int			ClearServer( t_connection *c );
	int			ConnectServer( t_connection *c, LPSTR lpIP, int nPort );
	int			ConnectLogin( t_connection *c, LPSTR ID, LPSTR PW );
	
	void		SendChatData( LPSTR lpStr );
	void		RecvChatData( t_server_chat_data *p );
	void		SendMoveData( LPCHARACTER ch );
	void		RecvMoveData( t_server_move *p );
	void		RecvWeatherData( t_server_weather *p );
	
	
	void		SendDropItem( int itemno, int x, int y, unsigned int attr[6] );
	void		SendTakeItem( int item_id );
	
	
	int			SendCreateCharacter( SCharacter *s );
	void		SendAllReady( void );
	void		SendLogOut( void );
	
	
	void		RecvUserAdd( t_server_user_add *c );
	void		RecvUserRemove( int server_id );
	int			SendUserRemove( void );
	
	int			GetNumFromServerID( int server_id );
	int			GetAliveCount( void );
	int			QueuePacket( t_packet *packet, int type );
	int			DequeuePacket( t_packet *packet, int type );
	int			HandleCommand(  t_connection *c, t_packet *p  );
	int			HandleReading( void );
	int			HandleWriting( t_connection *c );
	void		SendAliveCheckRoutine( void );
	int			HandleRunning( t_connection *c, bool flag );
	int			HandleCommand2(t_packet &packet,t_connection *c);//011212 lsw
	
	int			SendChoiceCharacter( int ch );

	void		SendEvent( int type, int id );

	void		SendMoveItem( POS s, POS t);
	void		RecvChrItemInfo_0( t_chr_item_info0 *i );
	void		RecvChrItemInfo_1( t_chr_item_info1 *i );
	void		RecvItemEquip( t_chr_status_info *chr );		// 拌牢 眠啊

	void		SendChangeEquip( LPCHARACTER ch );


	void		SendMagicInfo( int target_id, int x, int y, int magic_no );

	void		SendPeaceBattle( LPCHARACTER ch );
	void		RecvPeaceBattle( int server_id, int peacests );


	void Recv_CMD_SEALSTONE_WAR_START( void );
	void Recv_CMD_SEALSTONE_WAR_LEFTTIME( DWORD t );
	void Recv_CMD_WAR_START_BLOCK( void );
	void Recv_CMD_SEALSTONE_RESULT_DEFEAT( void );
	void Recv_CMD_SEALSTONE_RESULT_VICTORY( void );
	void Recv_CMD_SEALSTONE_RESULT_DRWAW( void );
	void Recv_CMD_SEALSTONE_STATUS( t_sealstone_client_status *tp );
	void Recv_CMD_NATION2NATION_RELATION_RESULT( t_packet *p );


	int GetAgentServerIPAddress( t_connection *c );



extern bool isNationWarfieldServer();// soto-030325

//---------------------------------------------------------------------------------
int ClearServer( t_connection *c )
{	
	t_packet	*tempbuf;

	if( c == NULL ) return 0;
	if( c->socket == 0 ) return 0;
	
	while ( c->inbuf )
	{
		tempbuf = c->inbuf;
		c->inbuf = c->inbuf->next;
		free( tempbuf );
	}
	
	while ( c->outbuf )
	{
		tempbuf = c->outbuf;
		c->outbuf = c->outbuf->next;
		free( tempbuf );
	}

	shutdown( c->socket, 0 );		
	closesocket( c->socket );
	memset( c, 0, sizeof( t_connection ) );

	return 1;
};	
	
//---------------------------------------------------------------------------------
bool Initialize( void )
{	
	::Sleep(300);
	::WSACleanup();
	WSADATA WSAData = {0,};
	if(::WSAStartup(WINSOCK_VERSION, &WSAData))//胶鸥飘诀
	{//角菩
		const int iError = ::WSAGetLastError();
		return false;
	}
	return true;//己傍
};	
	
//---------------------------------------------------------------------------------
void Release( t_connection *c )
{	
	ClearServer( c );
	WSACleanup( );
	Sleep(1000);
};		
	
		
//-------------------------------------------------------------------------------------
int ConnectServer( t_connection *c, LPSTR lpIP, int nPort )
{		
	struct sockaddr_in	addr = {0,};
	int i;
		
	if( SysInfo.notconectserver ) return 1;
		
    if ( lpIP == NULL || strlen( lpIP ) <= 0 || nPort <= 0 )
	{	
		return( -2 );
	}	
		
	if( c->socket ) 
	{	
		::Release( c );
		::Sleep( 1000 );
		::Initialize();
	}	
		
	for( i = 0 ; i < 10 ; i ++)
	{	
		c->socket = socket( AF_INET, SOCK_STREAM, 0 );  // 牢磐齿鸥涝, 胶飘覆家	南
		if ( c->socket == INVALID_SOCKET  )										
		{																		
			int err = WSAGetLastError();										
			switch( err )
			{
				case WSANOTINITIALISED :	::Release( c );
											::Initialize();		
											::Sleep( 30 );
											break;
			}
		}
		else break;
	}
	if( i == 10 ) return -2;
		
	addr.sin_family = AF_INET;
	addr.sin_port = htons( nPort );
	addr.sin_addr.s_addr = inet_addr( lpIP );
	u_long argp = 1;
	ioctlsocket ( c->socket, FIONBIO, &argp);
	int ret = connect( c->socket, ( LPSOCKADDR )&addr, sizeof( addr ) );
		
	for( i = 0 ; i < 4 ; i ++)
	{	
		fd_set wfds;
		FD_ZERO(&wfds);
		FD_SET(c->socket, &wfds);
		struct timeval t;
		t.tv_sec =  2;
		t.tv_usec = 0;
		select (0, NULL, &wfds, NULL, &t);
		if ( !FD_ISSET( c->socket, &wfds) ) // send镜荐 乐绰 惑炔捞 酒聪搁...		
		{																			
			if( i == 9 )						// 佬芭唱 镜荐 绝绰 惑炔阑 9锅鳖瘤绰 扁促妨霖促. 
			{		
				int err = WSAGetLastError();										
				Release( c );
				return INVALID_SOCKET;
			}
		}
		else break;
	}	
	memset( &c->packet, 0, sizeof( t_packet ) );
	c->packet_pnt		 = 0;
	c->packet_size		 = 2; //  iNETWORK DLL狼 Packet阑 罐绰促.
	c->packet_status	 = 0;
	c->packet_count[ 0 ] = 0;
	c->packet_count[ 1 ] = 0;
		
	alive_time = ::timeGetTime( );
		
	c->state = CONNECT_OK;
		
    return( 1 );
}

int ConnectServerProxy( t_connection *c, LPSTR lpIP, int nPort )
{	
	struct sockaddr_in	addr = {0,};
	int i;
	
	if( SysInfo.notconectserver ) return 1;
	
    if ( lpIP == NULL || strlen( lpIP ) <= 0 || nPort <= 0 )
	{	
		return( -2 );
	}	
	
	if( c->socket ) 
	{
		::Release( c );
		::Initialize();
//		Sleep( 1000 );
	}
	
	for( i = 0 ; i < 10 ; i ++)
	{	
		c->socket = socket( AF_INET, SOCK_STREAM, 0 );  // 牢磐齿鸥涝, 胶飘覆家	南
		if ( c->socket == INVALID_SOCKET  )										
		{																		
			int err = WSAGetLastError();										
			switch( err )
			{
			case WSANOTINITIALISED :	::Release( c );
										::Initialize();		break;
			}
		}
		else break;
		
		Sleep( 30 );
	}	
	if( i == 10 ) return -2;
	
	u_long argp = 1;
	ioctlsocket ( c->socket, FIONBIO, &argp);
	
	addr.sin_family = AF_INET;
	addr.sin_port = htons( nPort );
	addr.sin_addr.s_addr = inet_addr( lpIP );
	
	int ret = connect( c->socket, ( LPSOCKADDR )&addr, sizeof( addr ) );
	
	for( i = 0 ; i < 4 ; i ++)
	{	
		fd_set wfds;
		FD_ZERO(&wfds);
		FD_SET(c->socket, &wfds);
		struct timeval t;
		t.tv_sec =  2;
		t.tv_usec = 0;
		select (0, NULL, &wfds, NULL, &t);
		if ( !FD_ISSET( c->socket, &wfds) ) // 佬芭唱 镜荐 乐绰 惑炔捞 酒聪搁...	
		{																			
			if( i == 9 )						// 佬芭唱 镜荐 绝绰 惑炔阑 9锅鳖瘤绰 扁促妨霖促. 
			{		
				Release( c );
				return INVALID_SOCKET;
			}
		}
		else break;
	}	

	memset( &c->packet, 0, sizeof( t_packet ) );
	c->packet_pnt = 0;
	c->packet_size = 2; // 
	c->packet_status = 0;
	c->packet_count[ 0 ] = 0;
	c->packet_count[ 1 ] = 0;

	alive_time = ::timeGetTime( );

	c->state = CONNECT_OK;

    return( 1 );
}

//----------------------------------------------------------------------//acer7
class CMyCodeString
{
	char my_string[20];
	char ConvChar(char a) { return a^0x38; }

public :
	CMyCodeString()
	{
		my_string[0] = ConvChar( 'T' );
		my_string[1] = ConvChar( 'h' );
		my_string[2] = ConvChar( 'a' );
		my_string[3] = ConvChar( 'n' );
		my_string[4] = ConvChar( 'k' );
		my_string[5] = ConvChar( ' ' );
		my_string[6] = ConvChar( 'y' );
		my_string[7] = ConvChar( 'o' );
		my_string[8] = ConvChar( 'u' );
		my_string[9] = ConvChar( ' ' );
		my_string[10] = ConvChar( 'a' );
		my_string[11] = ConvChar( 'l' );
		my_string[12] = ConvChar( 'l' );
		my_string[13] = 0;
		my_string[14] = ConvChar( ' ' );
		my_string[15] = ConvChar( ' ' );
		my_string[16] = ConvChar( ' ' );
		my_string[17] = ConvChar( ' ' );
		my_string[18] = ConvChar( ' ' );
		my_string[19] = 0;
	}
	char GetChar( int index ) 
	{ 
		if( index == MAX_MY_STRING-1 ) return my_string[index];
		else return ConvChar( my_string[index] ); 
	}

	char GetCount(){ return strlen(my_string); }
};

#ifdef _DEBUG
int g_MyCode = 0;//021001 lsw
#endif

int SetMyCode( short int &mycode, char *mystring )
{
#ifdef KOREA_LOCALIZING_
	const int MY_CODE = 1315;
#endif
#ifdef TAIWAN_LOCALIZING_
	const int MY_CODE = 3315;
#endif
#ifdef HONGKONG_LOCALIZING_
	const int MY_CODE = 4315;
#endif
#ifdef CHINA_LOCALIZING_
	const int MY_CODE = 5315;
#endif
#ifdef USA_LOCALIZING_
	const int MY_CODE = 7315;
#endif
#ifdef JAPAN_LOCALIZING_
	const int MY_CODE = 8315;
#endif

	mycode = MY_CODE;

#ifdef _DEBUG
	g_MyCode = mycode;//021001 lsw
#endif

	CMyCodeString MY_STRING;
	for( int i=0; i<MY_STRING.GetCount(); i++ )
	{
		mystring[i] = MY_STRING.GetChar( i );
	}
	return 1;
}
//-------------------------------------------------------

//020101 lsw
int ConnectLogin( t_connection *c, LPSTR ID, LPSTR PW ,int LineNum )
{
	if( SysInfo.notconectserver ) {return 1;}
	
	t_packet	packet;
	packet.h.header.type = CMD_ACCESS_LOGIN;
	packet.h.header.size = sizeof(t_ClientAccessLogin);

	packet.u.ClientAccessLogin.init= en.GetHSELCustomizeOption();
	memcpy( packet.u.ClientAccessLogin.id, ID, ID_LENGTH );
	memcpy( packet.u.ClientAccessLogin.pw, PW, PW_LENGTH );
#ifdef _DEBUG
	packet.u.ClientAccessLogin.version = GM_TOOL_VERSION+abs(rand()%100)+1;
#else
	packet.u.ClientAccessLogin.version = GM_TOOL_VERSION;
#endif
	::SetMyCode( packet.u.ClientAccessLogin.mycode, packet.u.ClientAccessLogin.mystring );

	::memset(packet.u.ClientAccessLogin.User_ID, 0 , sizeof(packet.u.ClientAccessLogin.User_ID));
	::memset(packet.u.ClientAccessLogin.GateWayIP, 0 , sizeof(packet.u.ClientAccessLogin.GateWayIP));

	if(g_pBill->ReturnLineNum()>=0)
	{

⌨️ 快捷键说明

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