#include "version.h" #include #include #include #include #include "common.h" #include "util.h" #include "log.h" #include "handletime.h" #include "net.h" #include "char_base.h" /* * * 公丹匹卅中手及反踏五仇心及凶太卞fopen(..,"w")允月 * by ringo */ struct tagLogconf{ char* label; char* entry; char filename[256]; FILE* f; BOOL append; /* append 允月井}踏五仇心及凶太卞SEEK_SET允月井 */ }LogConf[LOG_TYPE_NUM]={ { "TALK: ", "talklog" ,"", NULL , TRUE}, { "PROC: ", "proc" , "" , NULL , FALSE}, { "ITEM: ", "itemlog" ,"", NULL , TRUE}, { "STONE: ", "stonelog" ,"", NULL , TRUE}, { "PET: ", "petlog" ,"", NULL , TRUE}, { "TENSEI: ", "tenseilog" ,"", NULL , TRUE}, { "KILL: ", "killlog","",NULL,TRUE}, // CoolFish: 2001/4/19 { "TRADE: ", "tradelog", "", NULL, TRUE}, // Arminius: 2001/6/14 { "HACK: ", "hacklog", "", NULL, TRUE}, // Nuke: 0626 Speed { "SPEED: ", "speedlog", "", NULL, TRUE}, // CoolFish: FMPopular 2001/9/12 { "FMPOP: ", "fmpoplog", "", NULL, TRUE}, // Robin 10/02 { "FAMILY: ", "familylog", "", NULL, TRUE}, // Shan 11/02 { "GM: ", "gmlog", "", NULL, TRUE}, #ifdef _GAMBLE_ROULETTE { "", "gamblelog", "", NULL, TRUE}, #endif { "LOGIN: ", "loginlog", "", NULL, TRUE}, { "", "pettranslog", "", NULL, TRUE}, //Syu 增加庄园战胜负Log { "FMPKRESULT: ", "fmpkresultlog" ,"", NULL , TRUE}, // Syu ADD 新增家族个人银行存取Log (不含家族银行) { "BANKSTONELOG: ", "bankstonelog" ,"", NULL , TRUE}, { "ACMESSAGE: ", "acmessagelog" ,"", NULL , TRUE}, { "PKCONTEND:", "pkcontendlog", "", NULL, TRUE}, #ifdef _STREET_VENDOR { "STREETVENDOR: ", "StreetVendorlog" ,"", NULL , TRUE}, #endif #ifdef _ANGEL_SUMMON { "ANGEL: ", "angellog" ,"", NULL , TRUE}, #endif #ifdef _NEW_MANOR_LAW { "FMPKGETMONEY: ","FMPKGetMoneylog","",NULL,TRUE}, { "FMFAMESHOP: ","FMFameShoplog","",NULL,TRUE}, #endif { "LOGOUT: ", "logoutlog", "", NULL, TRUE}, }; tagWarplog warplog[MAXMAPNUM]; tagWarpCount warpCount[MAXMAPLINK]; /*------------------------------------------------------------ * 娄醒 * 忒曰袄 ------------------------------------------------------------*/ static BOOL readLogConfFile( char* filename ) { FILE* f; char line[256]; char basedir[256]; int linenum=0; { char* r; r = rindex( filename, '/' ); if( r == NULL )snprintf(basedir,sizeof(basedir),"." ); else{ memcpy( basedir,filename,r-filename ); basedir[r-filename] = '\0'; } } f = fopen( filename , "r"); if( f == NULL ){ print( "Can't open %s\n" , filename ); return FALSE; } while( fgets( line, sizeof( line ) ,f ) ){ char firstToken[256]; int i; BOOL ret; linenum++; deleteWhiteSpace(line); /* remove whitespace */ if( line[0] == '#' )continue; /* comment */ if( line[0] == '\n' )continue; /* none */ chomp( line ); /* remove tail newline */ ret = getStringFromIndexWithDelim( line , "=", 1, firstToken, sizeof(firstToken) ); if( ret == FALSE ){ print( "Find error at %s in line %d. Ignore\n", filename , linenum); continue; } for( i=0 ; i= LOG_TYPE_NUM )return; if( LogConf[logtype].append ){ if( !LogConf[logtype].f )return; fputs( LogConf[logtype].label, LogConf[logtype].f); va_start(arg,format); vfprintf( LogConf[logtype].f,format,arg ); va_end( arg ); fputc( '\n', LogConf[logtype].f ); } else { FILE *f = fopen( LogConf[logtype].filename ,"w" ); if( !f ) return; fputs(LogConf[logtype].label , f ); va_start(arg,format); vfprintf( f , format,arg); va_end(arg); fputc( '\n' , f); fclose(f); } } BOOL initLog( char* filename ) { if( readLogConfFile( filename ) == FALSE )return FALSE; openAllLogFile(); return TRUE; } //Syu 增加庄园战胜负Log void Logfmpk( char *winner, int winnerindex, int num1, char *loser, int loserindex, int num2, char *date, char *buf1, char *buf2, int flg) { switch( flg){ case 1: { struct tm tm1; char buf[256]; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); sprintf( buf, " (%d:%d)", tm1.tm_hour, tm1.tm_min); printl( LOG_FMPKRESULT, "\nFMPK: [%s]地点:%s %s(%d) 约战要求 %s(%d) time:%s", buf1, buf2, winner, winnerindex, loser, loserindex, buf); } break; case 2: printl( LOG_FMPKRESULT, "\nFMPK: Winner %s(%d)=>%d Loser %s(%d)=>%d time:%s", winner, winnerindex, num1, loser, loserindex, num2 ,date); break; } } void Logfmpk_war(int dueltime,int mytime){ printl( LOG_FMPKRESULT, "\nFMPK_WAR: dueltime=%d,mytime=%d", dueltime,mytime); } #ifdef _NEW_MANOR_LAW void LogFMPKGetMomey(char *szFMName,char *szID,char *szCharName,int iMomentum,int iGetMoney,int iDest) { struct tm tm1; char szDest[3][6] = {"身上","银行","错误"}; if(iDest < 0 || iDest > 1) iDest = 2; memcpy(&tm1,localtime((time_t*)&NowTime.tv_sec),sizeof(tm1)); printl(LOG_FMPK_GETMONEY,"FMName:%s\tID:%s\tName:%s\tMomentum:%d\tGetMoney:%d\tAddTo:%s\t(%d:%d)", szFMName,szID,szCharName,iMomentum,iGetMoney,szDest[iDest],tm1.tm_hour,tm1.tm_min); } void LogFMFameShop(char *szFMName,char *szID,char *szCharName,int iFame,int iCostFame) { struct tm tm1; memcpy(&tm1,localtime((time_t*)&NowTime.tv_sec),sizeof(tm1)); printl(LOG_FM_FAME_SHOP,"FMName:%s\tID:%s\tName:%s\tFame:%d\tCostFame:%d\t(%d:%d)", szFMName,szID,szCharName,iFame,iCostFame,tm1.tm_hour,tm1.tm_min); } #endif void LogAcMess( int fd, char *type, char *mess ) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); if( strstr( mess, "Broadcast") != NULL ) return; printl( LOG_ACMESS, "%d %s [%s] (%d:%d)" , fd, type, mess, tm1.tm_hour, tm1.tm_min); } void LogItem( char *CharName, /* 平乓仿弁正 */ char *CharID, /* 平乓仿弁正ID */ int ItemNo, /* 失奶 丞 寞 */ char *Key, /* 平□伐□玉 */ int floor, /* 甄 */ int x, int y, char *uniquecode, // shan 2001/12/14 char *itemname, int itemID ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_ITEM, "%s\t%s\t%d(%s)=%s,(%d,%d,%d)(%d:%d),%s" , CharName, CharID, itemID, itemname, Key, floor, x, y, tm1.tm_hour, tm1.tm_min, uniquecode ); } void LogPkContend( char *teamname1, char *teamname2, int floor, int x, int y, int flg ) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); if( flg == 0 ) { printl( LOG_PKCONTEND, "[%32s 胜 %32s],(%5d,%4d,%4d)(%d:%d)" , teamname1, teamname2, floor, x, y, tm1.tm_hour, tm1.tm_min); }else{ printl( LOG_PKCONTEND, "Msg:[%s],(%5d,%4d,%4d)(%d:%d)" , teamname1, floor, x, y, tm1.tm_hour, tm1.tm_min); } } void LogPetTrans( char *cdkey, char *uniwuecde, char *uniwuecde2, char *CharName, int floor, int x, int y, int petID1, char *PetName1, int petLV, int petrank, int vital1, int str1, int tgh1, int dex1, int total1, int petID2, char *PetName2, int vital2, int str2, int tgh2, int dex2, int total2, int work0, int work1, int work2, int work3, int ans, int trans ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( PETTRANS, "\n*PETTRANS cdkey=%s unid=%s munid=%s %s (%d:%d) %d=%s LV:%d rand:%d trans:%d :[ %d, %d, %d, %d]=%d %d=%s :[ %d, %d, %d, %d]=%d [ %d, %d, %d, %d]=%d\n", cdkey, uniwuecde, uniwuecde2, CharName, tm1.tm_hour, tm1.tm_min, petID1, PetName1, petLV, petrank, trans, vital1, str1, tgh1, dex1, total1, petID2, PetName2, vital2, str2, tgh2, dex2, total2, work0, work1, work2, work3, ans ); } /*------------------------------------------------------------ * * 矢永玄夫弘毛潸月 * -------------------------------------------------------------*/ void LogPet( char *CharName, /* 平乓仿弁正 */ char *CharID, char *PetName, int PetLv, char *Key, /* 平□伐□玉 */ int floor, /* 甄 */ int x, int y, char *uniquecode // shan 2001/12/14 ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); // shan 2001/12/14 //printl( LOG_PET, "%s\t%s\t%s:%d=%s,(%d,%d,%d)(%d:%d)" , CharName, CharID, // PetName, PetLv, // Key, // floor, x, y, tm1.tm_hour, tm1.tm_min ); printl( LOG_PET, "%s\t%s\t%s:%d=%s,(%d,%d,%d)(%d:%d),%s" , CharName, CharID, PetName, PetLv, Key, floor, x, y, tm1.tm_hour, tm1.tm_min, uniquecode); } #ifdef _STREET_VENDOR void LogStreetVendor( char *SellName, char *SellID, char *BuyName, char *BuyID, char *ItemPetName, int PetLv, //若是道具此值为 -1 int iPrice, char *Key, int Sfloor, int Sx, int Sy, int Bfloor, int Bx, int By, char *uniquecode, int streettype ){ struct tm tm1; memcpy(&tm1,localtime((time_t *)&NowTime.tv_sec),sizeof(tm1)); char *streetmsg=NULL; if (streettype==0) streetmsg="石币"; if (streettype==1) streetmsg="声望"; if (streettype==2) streetmsg="会员点"; if (streettype==3) streetmsg="积分"; if (streettype==4) streetmsg="活力"; printl(LOG_STREET_VENDOR,"type:%s Sell:%s\t%s\tBuy:%s\t%s\tName=%s:Lv=%d|Price:%d,%s,SXY(%d,%d,%d)BXY(%d,%d,%d)(%d年%d月%d日 %d:%d),%s",streetmsg,SellName,SellID,BuyName,BuyID, ItemPetName,PetLv,iPrice,Key,Sfloor,Sx,Sy,Bfloor,Bx,By,tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,uniquecode); } #endif void LogBankStone( char *CharName, /* 平乓仿弁正 */ char *CharId, /* 交□扒□ID */ int meindex, int Gold, /* 嗯喊 */ char *Key, /* 平□伐□玉 */ int floor, /* 甄 */ int x, int y, int my_gold, int my_personagold ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_STONE, "%s:%s\ts:%d=%s,(%d,%d,%d)(%d:%d) <>" , CharId, CharName, Gold, Key, floor, x, y, tm1.tm_hour, tm1.tm_min , my_gold, my_personagold ); } void LogPetPointChange( char * CharName, char *CharID, char *PetName, int petindex, int errtype, int PetLv, char *Key,int floor, int x, int y) { struct tm tm1; int vit,str,tgh,dex; int l_vit,l_str,l_tgh,l_dex; int pet_ID, levellvup; pet_ID = CHAR_getInt( petindex, CHAR_PETID ); vit = CHAR_getInt( petindex, CHAR_VITAL ); str = CHAR_getInt( petindex, CHAR_STR ); tgh = CHAR_getInt( petindex, CHAR_TOUGH ); dex = CHAR_getInt( petindex, CHAR_DEX ); levellvup = CHAR_getInt( petindex, CHAR_ALLOCPOINT); l_vit = (levellvup >> 24); l_str = (levellvup >> 16)&0xff; l_tgh = (levellvup >> 8 )&0xff; l_dex = (levellvup >> 0 )&0xff; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_PET, "%s\t%s\t%s:%d=%s,(%d,%d,%d)(%d:%d),err:%d %d<<%d,%d,%d,%d>>lvup<<%d,%d,%d,%d>>" , CharName, CharID, PetName, PetLv, Key, floor, x, y, tm1.tm_hour, tm1.tm_min , errtype, pet_ID ,vit,str,tgh,dex,l_vit,l_str,l_tgh,l_dex); } /*------------------------------------------------------------ * * 鳖戏夫弘毛潸月 * -------------------------------------------------------------*/ void LogTensei( char *CharName, /* 平乓仿弁正 */ char *CharID, char *Key, /* 平□伐□玉 */ int level, //伊矛伙 int transNum, //鳖戏荚醒 int quest, //弁巨旦玄醒 int home, //请褥哗 int item, // 笛失奶 丞 井曰醒 int pet, // 笛矢永玄 井曰醒 int vital, // 祭蟆Vital int b_vital, // 祭 vital int str, // 祭蟆str int b_str, // 祭 str int tgh, // 祭蟆 int b_tgh, // 祭 int dex, // 祭蟆 int b_dex // 祭 ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_TENSEI, "%s\t%s\t%s=(%d,%d,%d,%d,%d,%d),(vi=%d->%d,str=%d->%d,tgh=%d->%d,dex=%d->%d),(%d,%d)" ,CharName, CharID, Key, level, transNum, quest, home, item, pet, vital, b_vital, str, b_str, tgh, b_tgh, dex, b_dex, tm1.tm_hour, tm1.tm_min ); } // LOG_TALK void LogTalk( char *CharName, /* 平乓仿弁正 */ char *CharID, int floor, /* 甄 */ int x, int y, char *message ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_TALK, "%2d:%2d\t%s\t%s\t%d_%d_%d\tT=%s" , tm1.tm_hour, tm1.tm_min, (CharID==NULL) ? "(null)" :CharID, (CharName==NULL) ? "(null)" :CharName, floor, x, y, message ); } /*------------------------------------------------------------ * 涩烂卞仄凶互匀化允屯化及白央奶伙毛田永弁失永皿 * 白央奶伙反弁夫□术今木化中卅仃木壬弁夫□术允月 * 娄醒 struct tm * 卅仄 * 忒曰袄 * 左□皿件仄凶白央奶伙及醒 ------------------------------------------------------------*/ void backupAllLogFile( struct tm *ptm ) { int i; char szBuffer[256]; for( i=0 ; itm_year+1900, ptm->tm_mon+1, ptm->tm_mday ); if( LogConf[i].f != NULL ){ /* 左□皿件今木化中凶日弁夫□术 */ fclose( LogConf[i].f ); /* 伉生□丞 */ rename( LogConf[i].filename, szBuffer ); /* 疯太左□皿件 */ LogConf[i].f = fopen( LogConf[i].filename , "a" ); }else{ /* 伉生□丞 */ rename( LogConf[i].filename, szBuffer ); /* 疯太左□皿件 */ LogConf[i].f = fopen( LogConf[i].filename , "a" ); } } } /*------------------------------------------------------------ * * 云嗯毛胶丹 * -------------------------------------------------------------*/ // Syu ADD 新增家族个人银行存取Log (不含家族银行) void LogFamilyBankStone( char *CharName, char *CharId, int Gold, int MyGold, char *Key, int floor, int x, int y, int banksum ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_BANKSTONELOG, "%s:%s\t%d=%s [%d] CHAR_GOLD(%d),(%d,%d,%d)(%d:%d)" , CharId, CharName, Gold, Key,banksum, MyGold, floor, x, y, tm1.tm_hour, tm1.tm_min ); print("\n%s:%s\t%d=%s [%d] CHAR_GOLD(%d),(%d,%d,%d)(%d:%d)\n" , CharId, CharName, Gold, Key,banksum, MyGold, floor, x, y, tm1.tm_hour, tm1.tm_min ); } void LogStone( int TotalGold, char *CharName, /* 平乓仿弁正 */ char *CharId, /* 交□扒□ID */ int Gold, /* 嗯喊 */ int MyGold, char *Key, /* 平□伐□玉 */ int floor, /* 甄 */ int x, int y ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); if(TotalGold == -1){ printl( LOG_STONE, "%s:%s\t%d=%s TOTAL_GOLD(%d),CHAR_GOLD(%d),(%d,%d,%d)(%d:%d)" , CharId, CharName, Gold, Key,TotalGold, MyGold, floor, x, y, tm1.tm_hour, tm1.tm_min ); } else{ printl( LOG_STONE, "%s:%s\t%d=%s CHAR_GOLD(%d),(%d,%d,%d)(%d:%d)" , CharId, CharName, Gold, Key, MyGold, floor, x, y, tm1.tm_hour, tm1.tm_min ); } } //ttom 12/26/2000 print the kill log void LogKill( char *CharName, char *CharId, char *CharPet_Item ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_KILL, "Name=%s:ID=%s\t%s (%d:%d)" ,CharName,CharId, CharPet_Item, tm1.tm_hour, tm1.tm_min ); } //ttom // CoolFish: Trade 2001/4/19 void LogTrade(char *message) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_TRADE, "%s (%d年%d月%d日 %d:%d)" , message, tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min ); } // CoolFish: Family Popular 2001/9/12 void LogFMPOP(char *message) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_FMPOP, "%s (%d:%d)" , message, tm1.tm_hour, tm1.tm_min ); } // Arminius 2001/6/14 char hackmsg[HACK_TYPE_NUM][4096]= { "??? 什麽事也没有发生", "无法取得通讯协定码", "收到无法辨识的通讯协定码", "检查码错误", "人物的HP为负", "账号封包出错", }; void logHack(int fd, int errcode) { struct tm tm1; char cdkey[4096]; char charname[4096]; unsigned long ip; char ipstr[4096]; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); CONNECT_getCdkey( fd, cdkey, 4096); CONNECT_getCharname( fd, charname, 4096); ip=CONNECT_get_userip(fd); sprintf(ipstr,"%d.%d.%d.%d", ((unsigned char *)&ip)[0], ((unsigned char *)&ip)[1], ((unsigned char *)&ip)[2], ((unsigned char *)&ip)[3]); if ((errcode<0) || (errcode>=HACK_TYPE_NUM)) errcode=HACK_NOTHING; printl( LOG_HACK, "(%d:%d) %s ip=%s cdkey=%s charname=%s", tm1.tm_hour, tm1.tm_min, hackmsg[errcode], ipstr, cdkey, charname); } void logHackKick(int fd) { struct tm tm1; char cdkey[4096]; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); CONNECT_getCdkey( fd, cdkey, 4096); if(strlen(cdkey)<1) strcpy(cdkey,"空"); printl( LOG_LOGIN, "hack:(%d年%d月%d日 %d:%d) cdkey=%s ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min, cdkey); } void logKong(char *ip) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_HACK, "(%d年%d月%d日 %d:%d) 空连接保护,IP=%s ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min,ip); } void logCC(char *ip) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_HACK, "(%d年%d月%d日 %d:%d) 主动防御,IP=%s ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min,ip); } void logWrongCdkey(char *ip) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_HACK, "(%d年%d月%d日 %d:%d) 错误账号,IP=%s ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min,ip); } void logWrongBao(char *ip) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_HACK, "(%d年%d月%d日 %d:%d) 错误封包,IP=%s ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min,ip); } void logRightBao(char *ip,int baolen) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_HACK, "(%d年%d月%d日 %d:%d) 正确封包,IP=%s,len=%d ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min,ip,baolen); } void logBigBao(char *ip,int baolen) { struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_HACK, "(%d年%d月%d日 %d:%d) 大包,IP=%s,len=%d ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min,ip,baolen); } void logFengBao(int clifd,char *cdkey,int funcid,char *buf) { /* int clicharaindex = CONNECT_getCharaindex( clifd ); if(CHAR_getWorkInt(clicharaindex,CHAR_WORKJILU)==1){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_HACK, "(%d年%d月%d日 %d:%d) 截取封包,cdkey=%s,funcid=%d,buf=%s ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min,cdkey,funcid,buf); } */ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); printl( LOG_HACK, "(%d年%d月%d日 %d:%d) 截取封包,cdkey=%s,funcid=%d,buf=%s ", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour, tm1.tm_min,cdkey,funcid,buf); } // Nuke 0626 void logSpeed(int fd) { struct tm tm1; char cdkey[4096]; char charname[4096]; unsigned long ip; char ipstr[4096]; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); CONNECT_getCdkey( fd, cdkey, 4096); CONNECT_getCharname( fd, charname, 4096); ip=CONNECT_get_userip(fd); sprintf(ipstr,"%d.%d.%d.%d", ((unsigned char *)&ip)[0], ((unsigned char *)&ip)[1], ((unsigned char *)&ip)[2], ((unsigned char *)&ip)[3]); printl( LOG_SPEED, "(%d:%d) ip=%s cdkey=%s charname=%s", tm1.tm_hour, tm1.tm_min, ipstr, cdkey, charname); } // Shan void LogGM( char *CharName, //角色名称 char *CharID, //玩家ID char *Message, //指令内容 int floor, int x, int y ) { struct tm tm1; memcpy(&tm1,localtime((time_t *)&NowTime.tv_sec),sizeof(tm1)); printl(LOG_GM,"%s\t%s\t%s\t(%d,%d,%d)\t(%d年%d月%d日 %d:%d)", CharName,CharID,Message,floor,x,y,tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min); } // Robin 10/02 void LogFamily( char *FMName, int fmindex, char *charName, char *charID, char *keyWord, char *data ){ struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); // CoolFish: 2001/10/11 log time printl( LOG_FAMILY, "%s\t%d\t%s\t%s\t= %s, %s (%d:%d)", FMName, fmindex, charName, charID, keyWord, data, tm1.tm_hour, tm1.tm_min ); } #ifdef _GAMBLE_ROULETTE void LogGamble( char *CharName, //角色名称 char *CharID, //玩家ID char *Key, //说明 int floor, int x, int y, int player_stone, //所拥有金钱 int Gamble_stone, //下注本金 int get_stone, //获得 int Gamble_num, int flg //flg = 1 玩家 2 庄家 ) { struct tm tm1; memcpy(&tm1,localtime((time_t *)&NowTime.tv_sec),sizeof(tm1)); if( flg == 1 ) { printl(LOG_GAMBLE,"%s\t%s\t TYPE:%s <>\t(%d,%d,%d)-(%d:%d) GAMBLENUM=%d", CharName,CharID,Key, player_stone, Gamble_stone, get_stone, floor,x,y,tm1.tm_hour,tm1.tm_min, Gamble_num); }else if( flg == 2 ) { printl(LOG_GAMBLE,"%s\tROULETTE MASTER\t TYPE:%s <>\t(%d,%d,%d)-(%d:%d)", CharName,Key, player_stone, floor,x,y,tm1.tm_hour,tm1.tm_min); } } #endif void LogLogin( char *CharID, //玩家ID char *CharName, //角色名称 int saveIndex, char *ipadress,char *pcid ) { struct tm tm1; memcpy(&tm1,localtime((time_t *)&NowTime.tv_sec),sizeof(tm1)); printl(LOG_LOGIN,"%s\t%s\ti=%d\t%s\tPCID=%s\t(%d年%d月%d日 %d:%d)", CharID,CharName,saveIndex,ipadress,pcid,tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min); } void LogLogout( char *CharID, //玩家ID char *CharName, //角色名称 int floor, int hp, char *file, int line ) { struct tm tm1; memcpy(&tm1,localtime((time_t *)&NowTime.tv_sec),sizeof(tm1)); printl(LOG_LOGIN,"%s\t%s\tfloor=%d\thp=%d\t(%d年%d月%d日 %d:%d)\tfile=%s%d", CharID,CharName,floor,hp,tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,file,line); } void warplog_to_file() { int i =0; char outbuf[128]; FILE *f; f = fopen("log/warp1.log" ,"w" ); if( !f ) return; for( i=0; i