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