📄 network.cpp
字号:
/*****************************************************************************\
* 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 + -