?? char.c
字號(hào):
#define _CHAR_C_// Spock +1 2000/12/6#include <time.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include "main.h"#include "char.h"#include "saacproto_serv.h"#include "util.h"#include "saacproto_lserver.h"// CoolFish: Family 2001/6/12#include "acfamily.h"#include "version.h"// Arminius 7.17 memory lock#include "lock.h"#include "recv.h"#ifdef _SASQL1#include "sasql.h"#endifstatic void getCharNameFromString(char*str ,char *out );static void getCharOptionFromString( char *str , char *out );static void getCharNameFromString(char*str ,char *out );static void makeCharFileName( char *idstring ,char *output, int outlen,int num);// Nuke *1*1static int makeSaveCharString( char *out , int outlen , char *nm , char *opt , char *info );static int findBlankCharIndex( char *id );static int unlinkCharFile( char *id , int num );#ifdef _SLEEP_CHAR // 取得非活躍人物檔名static void makeSleepCharFileName( char *id,char *output, int outlen, int num);static void makeSleepCharPoolItemFileName( char *id,char *output, int outlen);#endif#ifdef _CHAR_POOLITEMstatic void makeCharPoolItemFileName( char *id,char *output, int outlen);#endif#define SPACE '|'#define SPACESTRING "|"#define IS_2BYTEWORD( _a_ ) ( (char)(0x80) <= (_a_) && (_a_) <= (char)(0xFF) )#define USERLOG( id , format, args...) \{\ char body[1000];\ char fn[1000];\ if(id[0]){\ snprintf( body ,sizeof(body), "%s.log.%d" , id ,get_rotate_count() );\ makeDirFilename( fn , sizeof(fn),logdir, getHash(id), body);\ LOGBASE( fn , "%u " , (unsigned int ) time(NULL) );\ LOGBASE( fn , format , ## args );\ }\}#ifdef _ANGEL_SUMMONstruct MissionTable missiontable[MAXMISSIONTABLE];#endif/* 仇及白央奶伙匹爛聒今木化中月楮醒反兮氏少 據(jù)毛勾井丹[ char *c0 : ID char *c1 : Passwd 手丹 據(jù)允氏匹月井日銀歹卅中 char *c2 : Charname char *c3 : opt Spock fixed, opt change to process char *c3 : process char *c4 : 勾井歹氏 int i0 : lock int i1 : mesgid */void charLoadCallback( int ti , int auth , char *c0, char* c1 , char *c2 , char *c3, char *c4, int i0 , int i1 ){ // Spock deleted 2000/11/2 //static int process_id = 0; // CoolFish: Init charindex 2001/10/16#ifdef _NewSave int charindex = -1;#else int charindex;#endif#ifndef _LOCK_SERVER char loadbuf[CHARDATASIZE]; char infobuf[CHARDATASIZE]; int lock = i0;#endif char *process = c3; char *id = c0; char *passwd = c1; char *charname = c2; int mesgid = i1; char *deadline = c4; // Spock deleted 2000/11/2 //process_id++; if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ), "%d" , auth );#ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , data, mesgid, charindex );#else saacproto_ACCharLoad_send( ti , FAILED , data, mesgid );#endif #ifdef _FIX_MESSAGE // WON ADD 修改WORKER封包內(nèi)容 // 同一星系重覆登入送 game end if( auth == 204 ){#ifdef _WAEI_KICK log("\n (%s) AP同一星系重覆登入,踢人!! ", id ); saacproto_ACKick_recv( ti, id, 7, -1); //踢人#ifdef _UNLOCKPOOL addUnlockPool( ti, id, "", process, ""); // AP解鎖#else addWorkerTask( id , "dummy" , "3" , dummyCallback , ti , id , "dummy" , charname , process ,"", mesgid , 0 );#endif#endif }else log("\n (%s) 登入異常!!:%d ", id, auth );#endif return; }#ifdef _DELAY_UNLOCK if( UNlockM_isBe( id ) ){ saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex ); return; }else#endif if( isLocked( id ) ){ //int process;#ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex );#else saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid );#endif //DeleteMemLock(getHash(id) & 0xff, id, &process); // 如果AP無(wú)鎖則AC解鎖 log("\n (%s) AC同一星系重覆登入,踢人!! ", id ); saacproto_ACKick_recv( ti, id, 7, -1); //踢人 // checkGSUCheck( id); return; } #ifdef _LOCK_SERVER if( CHECK_LS_BEUSE() == TRUE ) { LServer_SACheckLock2_send( ti, id, mesgid, charname, 1, process);//process return; }else { saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex ); }#else charindex = getCharIndexByName( id , charname );#ifdef _NewSave //log("\n檔案裝載序號(hào):%d 賬號(hào):%s 名字:%s\n", charindex, id, charname);#endif#ifdef _SQL_BACKGROUND sasql_online(id,charname);#endif if( charindex < 0 ){ /* 平乓仿互繡箕仄卅中及匹巨仿□卅及分 */#ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "char nonexistent" , mesgid , charindex );#else saacproto_ACCharLoad_send( ti , FAILED , "char nonexistent" , mesgid );#endif return; } // log( "loadCharOne: id:[%s] char:[%s]\n", id, charname ); if( loadCharOne( id , charindex , loadbuf ,sizeof( loadbuf ))<0){#ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "cannot load ( disk i/o error?)", mesgid, charindex );#else saacproto_ACCharLoad_send( ti , FAILED , "cannot load ( disk i/o error?)", mesgid );#endif return; }else{#ifdef _CHAR_POOLITEM checkCharPoolItem( id);#endif#ifdef _CHAR_POOLITEM checkCharPoolPet( id);#endif } {//ttom char *c_ptr; c_ptr=loadbuf; while(*c_ptr!='\0'){ if( IS_2BYTEWORD(*c_ptr) ){ if(*(c_ptr+1)==' '){ *(c_ptr+1)=0x41; } c_ptr++; if(*c_ptr=='\0') break; } c_ptr++; } }//ttom if( lock ){ char result[100]; char retdata[100];#ifdef _LOCK_ADD_NAME if( lockUser( getGSName(ti) , id , charname, passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){#else // Spock 2000/11/2 if( lockUser( getGSName(ti) , id , passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){#endif saacproto_ACCharLoad_send( ti , FAILED, "lock FAIL!!" , mesgid , charindex ); return; }else {#ifdef _TIMEOUTKICK //#endif } } memset( infobuf , 0 , sizeof( infobuf )); getCharInfoFromString( loadbuf , infobuf ); makeStringFromEscaped( infobuf ); #ifdef _BAD_PLAYER // WON ADD 送壞玩家去關(guān) { extern int MAX_BAD_PLAYER; extern char BadPlayerList[500][20]; // 定義最大 500 名 int i; for( i=0; i<=MAX_BAD_PLAYER; i++){ if( strcmp( id, BadPlayerList[i] ) == 0){ saacproto_ACCharLoad_send( ti , BADPLAYER , infobuf , mesgid, charindex );#ifdef _WAEI_KICK saacproto_ACKick_recv( ti, id, 10, -1);#endif return; } } }#endif #ifdef _NewSave saacproto_ACCharLoad_send( ti , SUCCESSFUL , infobuf , mesgid, charindex );#else saacproto_ACCharLoad_send( ti , SUCCESSFUL , infobuf , mesgid);#endif #ifdef _WAEI_KICK saacproto_ACKick_recv( ti, id, 10, -1); //踢其他星系#endif #endif}#ifdef _NewSaveint charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid , int charindex)#else int charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid )#endif{#ifdef _NewSave#else int charindex;#endif char savebuf[CHARDATASIZE]; int ret = -1; memset(savebuf, 0, sizeof(savebuf)); //andy_log if( strstr( charinfo, "DATAEND=") == NULL ){ FILE *fp; if( (fp=fopen( "badpetstring.txt", "a+")) != NULL ){ fprintf( fp, "%s\n", charinfo); fclose( fp); } log( "err add batpetstring.txt:%s[%s] !\n", id, charname); } if( unlock ){ char result[100]; char retdata[100]; #ifdef _LOCK_ADD_NAME if( (ret = lockUser( getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){#else if( (ret = lockUser( getGSName(ti), id , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){#endif log( "Unlock:%s FAILED err!!\n", id); }#ifdef _LOCK_SERVER if( CHECK_LS_BEUSE() == TRUE ) { LServer_SAUNLock_send( ti, id, mesgid, 1); }#endif } // Nuke *1 add escape if( makeSaveCharString( savebuf , sizeof( savebuf ) , charname, opt , charinfo )<0){ log("\n ACCharSave:too long "); saacproto_ACCharSave_send( ti , FAILED , "too long" , mesgid ); // Spock fixed 2000/11/1 return ret; }#ifdef _NewSave if (charindex == -1) charindex = getCharIndexByName( id , charname );#else // Nuke *1- charindex = getCharIndexByName( id , charname );#endif if( charindex < 0 ){ int blankind = findBlankCharIndex( id ); if( blankind < 0 ){ log("\n ACCharSave:char full "); saacproto_ACCharSave_send( ti , FAILED , "char full" ,mesgid); return ret; } else { charindex = blankind; } } log( "賬號(hào):[%s] 人物:[%s]\n", id, charname ); if( saveCharOne( id , charindex , savebuf ) < 0 ){ log("\n ACCharSave:disk I/O error or a bug "); saacproto_ACCharSave_send( ti , FAILED , "disk I/O error or a bug", mesgid ); return ret; } else {#ifdef _SASQL sasql_save_nm( charindex, id, charname ); sasql_save_opt( charindex, id, opt ); sasql_save_int_info( charindex, id, charinfo ); sasql_save_char_info( charindex, id, charinfo );#endif } saacproto_ACCharSave_send( ti , SUCCESSFUL , "" , mesgid); return ret;}void charListCallback( int ti , int auth , char *c0 , char *c1 , char *c2 , char *c3 , char *c4 , int i0 , int i1 ){#ifndef _LOCK_SERVER char listbuf[CHARDATASIZE];#endif char *id = c0; int mesgid = i0; //log(" 檔案列表回溯:%s:%d \n", id, auth); if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ) , "%d" , auth ); saacproto_ACCharList_send( ti , FAILED , data , mesgid ); total_ng_charlist++; return; } if (!sasql_query(c0,c1)){#ifdef _SQL_REGISTER if(!sasql_register(c0,c1))#endif { log("密碼錯(cuò)誤或沒(méi)有注冊(cè)\n"); saacproto_ACCharList_send( ti , FAILED , "Password error" , mesgid); return;}} // 取消下列 unlock 動(dòng)作#ifndef _FIX_MESSAGE // WON ADD 修改WORKER封包內(nèi)容#ifdef _DELAY_UNLOCK if( UNlockM_isBe( id ) ){ saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); return; }else#endif if( isLocked( id ) ){ saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); checkGSUCheck( id ); total_ng_charlist++; return; }#endif // end FIX_MESSAGE #ifdef _LOCK_SERVER if( CHECK_LS_BEUSE() == TRUE ) { LServer_SACheckLock1_send( ti, id, mesgid, 1); }else { saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); total_ng_charlist++; }#else #ifdef _SLEEP_CHAR // 如果無(wú)新檔, 將舊檔移至新檔 { char fn_old[256], fn_new[256]; FILE *fp_old, *fp_new; int i; // 移人物檔 for( i=0; i<MAXCHAR_PER_USER; i++) { makeCharFileName( id, fn_new, sizeof(fn_new), i); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharFileName( id, fn_old, sizeof(fn_old), i); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // 搬移 //filecopy( fn_old, fn_new); // 復(fù)制 log(" 移檔_%s ", fn_new);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -