#include "version.h" #include #include #include #include #include #include "init.h" #include "net.h" #include "handletime.h" #include "char.h" #include "map_warppoint.h" #include "npcgen.h" #include "log.h" #include "configfile.h" #include "battle.h" #include "petmail.h" #include "autil.h" #include "family.h" #include "defend.h" #include "trade.h" #ifdef _NPCSERVER_NEW #include "npcserver.h" #endif #ifdef _RECAL_SEND_COUNT // WON 传送GS资讯 #include "mclient.h" #endif #ifdef _DEATH_CONTEND #include "deathcontend.h" #endif #ifdef _CHATROOMPROTOCOL // (不可开) Syu ADD 聊天室频道 #include "chatroom.h" #endif static void ShutdownProc( void); void mainloop( void ); struct tm tmNow, tmOld; void family_proc(); // Terry add 2001/10/11 #ifdef _SERVICE extern int g_nServiceSocket; #endif #ifdef _CHANNEL_MODIFY extern int InitOccChannel(void); #endif #ifdef _ANGEL_SUMMON #define ANGELTIMELIMIT 3*24*60*60 // 完成任务时限(秒) int AngelReady =0; int AngelTimelimit = ANGELTIMELIMIT; time_t AngelNextTime; void AngelReadyProc(); #endif #include "genver.h" void warplog_proc(); int main( int argc , char** argv, char** env ) { /* 午曰丐尹内凛棉毛涩烂仄化云仁 */ setNewTime(); if ( argc > 1 && 0==strcmp(argv[1],"-v")) { printf("%s",genver); exit(0); } else fprintf(stderr,"%s",genver); EXITWITHEXITCODEIFFALSE( util_Init() , 1); LoadAnnounce(); // Arminius 7.12 loginannounce /* 赓渝涩烂 */ memcpy( &tmOld, localtime( (time_t *)&NowTime.tv_sec), sizeof( tmNow ) ); EXITWITHEXITCODEIFFALSE( init(argc , argv ,env ) , 1); LoadPetTalk(); // Arminius 8.14 pet talk #ifdef _GAMBLE_BANK Load_GambleBankItems(); #endif #ifdef _CFREE_petskill Load_PetSkillCodes(); #endif #ifdef _ITEM_PILEFORTRADE TRADE_InitTradeList(); #endif #ifdef _DEATH_CONTEND if( PKLIST_InitPkTeamList( MAXTEAMNUM ) == -1 ) return 1; #endif #if USE_MTIO /* 穴伙民旦伊永玉及午五反仇仇匹坌昴 */ if( MTIO_setup() < 0 ){ print( "cannot setup MT environment\n" ); return 1; } /* 仇仇匹 join 仄化蔽 */ MTIO_join(); #else mainloop(); #endif return 0; } void mainloop( void ) { NPC_generateLoop( 1 ); signal(SIGUSR1,sigusr1); signal(SIGUSR2,sigusr2); #ifdef _MAP_WARPPOINT MAPPOINT_InitMapWarpPoint(); if( !MAPPOINT_loadMapWarpPoint() ){ return; } #endif #ifdef _ASSESS_SYSEFFICACY Assess_InitSysEfficacy(); #endif #ifdef _CHECK_BATTLETIME check_battle_com_init(); #endif #ifdef _CHATROOMPROTOCOL // (不可开) Syu ADD 聊天室频道 InitChatRoom(); #endif #ifdef _CHANNEL_MODIFY if(!InitOccChannel()) return; // 初始化职业频道 #endif #ifdef _GM_BROADCAST // WON ADD 客服公告系统 Init_GM_BROADCAST( 0, 0, 0, "" ); #endif #ifdef _DEATH_FAMILY_STRUCT // WON ADD 家族战存放胜负资料 Init_FM_PK_STRUCT(); #endif #ifdef _ANGEL_SUMMON AngelReady = 0; AngelNextTime = time(NULL) + 1*60; #endif //#ifdef _ALLDOMAN // InitHeroList(); //#endif while(1){ #ifdef _ASSESS_SYSEFFICACY Assess_SysEfficacy( 0 ); #endif setNewTime(); memcpy(&tmNow, localtime( (time_t *)&NowTime.tv_sec), sizeof( tmNow ) ); if( tmOld.tm_hour != getLogHour( ) && tmNow.tm_hour == getLogHour( ) ){ backupAllLogFile( &tmOld ); } setNewTime(); #ifdef _ASSESS_SYSEFFICACY_SUB //显示LOOP时间 Assess_SysEfficacy_sub( 0, 1); netloop_faster(); Assess_SysEfficacy_sub( 1, 1); //Assess_SysEfficacy_sub( 0, 2); NPC_generateLoop( 0 ); //Assess_SysEfficacy_sub( 1, 2); Assess_SysEfficacy_sub( 0, 3); BATTLE_Loop(); Assess_SysEfficacy_sub( 1, 3); Assess_SysEfficacy_sub( 0, 4); CHAR_Loop(); Assess_SysEfficacy_sub( 1, 4); //Assess_SysEfficacy_sub( 0, 5); PETMAIL_proc(); //Assess_SysEfficacy_sub( 1, 5); //Assess_SysEfficacy_sub( 0, 6); family_proc(); //Assess_SysEfficacy_sub( 1, 6); //Assess_SysEfficacy_sub( 0, 7); chardatasavecheck(); //Assess_SysEfficacy_sub( 1, 7); #ifdef _GM_BROADCAST // WON ADD 客服公告系统 //Assess_SysEfficacy_sub( 0, 8); GM_BROADCAST(); //Assess_SysEfficacy_sub( 1, 8); #endif #else //不显示LOOP时间 netloop_faster(); NPC_generateLoop( 0 ); BATTLE_Loop(); CHAR_Loop(); PETMAIL_proc(); family_proc(); chardatasavecheck(); #ifdef _GM_BROADCAST // WON ADD 客服公告系统 GM_BROADCAST(); #endif #endif #ifdef _ANGEL_SUMMON AngelReadyProc(); #endif if( tmOld.tm_sec != tmNow.tm_sec ) { CHAR_checkEffectLoop(); } if( SERVSTATE_getShutdown()> 0 ) { ShutdownProc(); } tmOld = tmNow; #ifdef _ASSESS_SYSEFFICACY Assess_SysEfficacy( 1); #endif } #ifdef _SERVICE close(g_nServiceSocket); #endif } static void sendmsg_toall( char *msg ) { int i; int playernum = CHAR_getPlayerMaxNum(); for( i = 0 ; i < playernum ; i++) { if( CHAR_getCharUse(i) != FALSE ) { CHAR_talkToCli( i, -1, msg, CHAR_COLORYELLOW); } } } static void ShutdownProc( void) { #define SYSINFO_SHUTDOWN_MSG "再过 %d 分钟後,即开始进行server系统维护。" #define SYSINFO_SHUTDOWN_MSG_COMP "server已关闭。" int diff,hun; diff = NowTime.tv_sec - SERVSTATE_getShutdown(); hun = SERVSTATE_getLimittime() - (diff/60); if( hun != SERVSTATE_getDsptime() ){ char buff[256]; if( hun != 0 ) { snprintf( buff, sizeof(buff), SYSINFO_SHUTDOWN_MSG, hun); } else { strcpy( buff, SYSINFO_SHUTDOWN_MSG_COMP); } sendmsg_toall( buff); SERVSTATE_setDsptime(hun); if( hun == 1 ) { SERVSTATE_SetAcceptMore( 0 ); } } /* closesallsockets */ if( hun == 0) { closeAllConnectionandSaveData(); SERVSTATE_setShutdown(0); SERVSTATE_setDsptime(0); SERVSTATE_setLimittime(0); #ifdef _KILL_12_STOP_GMSV // WON ADD 下sigusr2後关闭GMSV //andy_reEdit 2003/04/28不准开... //system("./stop.sh"); #endif } } void family_proc() { static unsigned long gettime = 0; static unsigned long checktime = 0; static unsigned long proctime = 0; #ifdef _CK_ONLINE_PLAYER_COUNT // WON ADD 计算线上人数 static unsigned long player_count_time = 0; int PLAYER_COUNT_TIME = 60*5; // 30秒传一次人数至 AC #endif #ifdef _RECAL_SEND_COUNT // WON 传送GS资讯 static unsigned long recal_count_time = 0; int RECAL_COUNT_TIME = 60; if( (unsigned long)NowTime.tv_sec > recal_count_time ){ recal_get_count(); #ifdef _GSERVER_RUNTIME //传送GSERVER执行多少时间给MSERVER gserver_runtime(); #endif recal_count_time = (unsigned long)NowTime.tv_sec + RECAL_COUNT_TIME; } #endif if( time(NULL) < proctime ) return; proctime = time(NULL)+5; if( (unsigned long)NowTime.tv_sec > gettime ){ getNewFMList(); gettime = (unsigned long)NowTime.tv_sec + 60*10; } if( (unsigned long)NowTime.tv_sec > checktime ){ //checkFamilyIndex(); checktime = (unsigned long)NowTime.tv_sec + 60*30; } #ifdef _CK_ONLINE_PLAYER_COUNT // WON ADD 计算线上人数 if( (unsigned long)NowTime.tv_sec > player_count_time ){ GS_SEND_PLAYER_COUNT(); player_count_time = (unsigned long)NowTime.tv_sec + PLAYER_COUNT_TIME; } #endif } void warplog_proc() { static unsigned long checktime = 0; if( (unsigned long)NowTime.tv_sec > checktime ){ warplog_to_file(); checktime = (unsigned long)NowTime.tv_sec + 300; } } #ifdef _ANGEL_SUMMON extern int player_online; void AngelReadyProc() { //static time_t lastCreateTime = time(NULL); time_t nowTime; //static unsigned long AngelNextTime = 30*60; struct tm *temptime; char msg[1024]; nowTime = time(NULL); if( nowTime < AngelNextTime ) return; if( player_online <= 10 ) { //print(" ANGEL:线上人数不足=%d ", player_online); return; } AngelReady = 1; //AngelNextTime = min( (int)(10000/player_online), 100)*60 + (unsigned long)nowTime; AngelNextTime = min( (int)(5000/player_online), 100)*60 + (unsigned long)nowTime; temptime = localtime( &AngelNextTime ); sprintf( msg, " ANGEL:产生一位缺额 下次产生时间=(%d/%d %d:%d) 目前人数=%d ", temptime->tm_mon+1, temptime->tm_mday, temptime->tm_hour, temptime->tm_min, player_online ); print( msg); //LogAngel( msg); } #endif