📄 log.c
字号:
#include "version.h"#include <stdio.h>#include <stdarg.h>#include <string.h>#include <time.h>#include "common.h"#include "util.h"#include "log.h"#include "handletime.h"#include "net.h"#include "char_base.h"/* * * 夫弘白央奶伙及潘 反append 允月手及午仄卅中手及互丐月[ * append允月手及反 赓卞白央奶伙毛夫日中化云仁[ * 公丹匹卅中手及反踏五仇心及凶太卞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}, // Terry 2001/09/28#ifdef _SERVICE { "SERVICE: ", "servicelog", "", NULL, TRUE}, #endif#ifdef _GAMBLE_ROULETTE { "", "gamblelog", "", NULL, TRUE}, #endif#ifdef _TEST_PETCREATE { "", "creatpetlog", "", NULL, TRUE}, { "", "creatpetavglog", "", 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 _LOG_OTHER { "OTHER: ", "otherlog" ,"", NULL , TRUE},#endif#ifdef _NEW_MANOR_LAW { "FMPKGETMONEY: ","FMPKGetMoneylog","",NULL,TRUE}, { "FMFAMESHOP: ","FMFameShoplog","",NULL,TRUE},#endif};tagWarplog warplog[MAXMAPNUM];tagWarpCount warpCount[MAXMAPLINK];/*------------------------------------------------------------ * 夫弘涩烂白央奶伙毛 氏匹 file 毛钒仁 * 娄醒 * filename char* 夫弘涩烂白央奶伙 * 忒曰袄 * FALSE 反褐 卅撩 匹丐月[ ------------------------------------------------------------*/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<arraysizeof(LogConf) ; i++ ){ if( strcmp( LogConf[i].entry, firstToken )== 0 ){ char secondToken[256]; ret = getStringFromIndexWithDelim( line, "=", 2, secondToken, sizeof(secondToken) ); if( ret == FALSE ){ print( "Find error at %s in line %d. Ignore\n", filename , linenum); continue; } snprintf( LogConf[i].filename, sizeof( LogConf[i].filename ), "%s/%s",basedir,secondToken); } } } fclose(f); return TRUE;}int openAllLogFile( void ){ int i; int opencount=0; for( i=0 ; i<arraysizeof(LogConf) ; i++ ){ if( ! LogConf[i].append )continue; LogConf[i].f = fopen( LogConf[i].filename , "a" ); if( LogConf[i].f != NULL )opencount++; } return opencount;}void closeAllLogFile( void ){ int i; struct tm tm1; memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); // WON FIX for( i=0 ; i<arraysizeof(LogConf) ; i++ ){ if( LogConf[i].f && LogConf[i].append ){ printl( i, "server down(%d:%d) " , tm1.tm_hour, tm1.tm_min); fclose( LogConf[i].f ); } }/* for( i=0 ; i<arraysizeof(LogConf) ; i++ ) if( LogConf[i].f && LogConf[i].append ) fclose( LogConf[i].f );*/}void printl( LOG_TYPE logtype, char* format , ... ){ va_list arg; if( logtype < 0 || logtype >= 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 增加庄园战胜负Logvoid 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; }}#ifdef _NEW_MANOR_LAWvoid 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);}#endifvoid 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_VENDORvoid 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){ struct tm tm1; memcpy(&tm1,localtime((time_t *)&NowTime.tv_sec),sizeof(tm1)); printl(LOG_STREET_VENDOR,"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),%s",SellName,SellID,BuyName,BuyID, ItemPetName,PetLv,iPrice,Key,Sfloor,Sx,Sy,Bfloor,Bx,By,tm1.tm_hour,tm1.tm_min,uniquecode);}#endifvoid 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) <<own=%d,bank=%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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -