www.pudn.com > saac.rar > recv.c


#define _RECV_C_

#include "version.h"
#include "main.h"
#include "saacproto_util.h"
#include "saacproto_serv.h"
#include "recv.h"
#include "char.h"
#include "db.h"
#include "mail.h"
#include "lock.h"
#include "util.h"

#ifdef _SASQL
#include "sasql.h"
#endif

// CoolFish: Family 2001/5/9
#include "acfamily.h"
#include "version.h"

#include 
#include 

char retdata[CHARDATASIZE];     
char result[CHARDATASIZE];        

// Spock +1 2000/11/1
#define MAX_PROCESS 16777216
#ifdef _VIP
void saacproto_ACServerLogin_recv( int ti,char* servername , char* serverpas, int checkvip )
{
    login_game_server( ti , servername , serverpas, checkvip,
												             result , sizeof( result ) ,
												             retdata , sizeof( retdata ));

    saacproto_ACServerLogin_send( ti ,result ,retdata );
}
#else
void saacproto_ACServerLogin_recv( int ti,char* servername , char* serverpas )
{
    login_game_server( ti , servername , serverpas,
												             result , sizeof( result ) ,
												             retdata , sizeof( retdata ));

    saacproto_ACServerLogin_send( ti ,result ,retdata );
}
#endif
/*
   必□丞扔□田□互失市它件玄扔□田□井日夫弘失它玄允月[
   int fd : 覆擂socket

*/
void  saacproto_ACServerLogout_recv( int ti  )
{

    logout_game_server( ti );
}

void saacproto_ACCharLoad_recv( int ti,char* id,char* pas,char* charname ,
                                int lock,char* opt , int mesgid)
{
    // Spock 2000/10/31
    static int process = 0;
    char buf[16];
    // Spock end
#ifdef _NewSave
    int charindex = -1;
#endif
 
    if( !is_game_server_login( ti ) ){
#ifdef _NewSave
        saacproto_ACCharLoad_send( ti , FAILED , "not login" , mesgid, charindex );
#else
        saacproto_ACCharLoad_send( ti , FAILED , "not login" , mesgid );
#endif
        return;
    }
    process++;
    if ( process > MAX_PROCESS ) process = 1;
    snprintf( buf , sizeof(buf) , "%d" , process );

		charLoadCallback(ti,0,id,pas,charname,buf,"",lock,mesgid);
    // Spock 2000/10/31
    //log( "读取档案: 附加作业 %s %s, 进程=%d\n", id,pas,process );
    // Spock end
}

/*
   平乓仿忡绣

   char *id : ID
   char *pas : 天允歹□升
   char *charname : 平乓仿  
   char *opt : 左皿扑亦件  侬  [ CharList及午五卞丢乒午仄化忒允树  
   char *charinfo : 白央奶伙卞忡绣允月平乓仿弁正及旦  □正旦树  [
   int id : 丢永本□斥id
*/
#ifdef _NewSave
void saacproto_ACCharSave_recv( int ti, char* id,
                                char *charname,char* opt ,
                                char* charinfo , int unlock , int mesgid , int charindex )
#else
void saacproto_ACCharSave_recv( int ti, char* id,
                                char *charname,char* opt ,
                                char* charinfo , int unlock , int mesgid )
#endif
{
    char process[16];
    int ret;
    if( !is_game_server_login(ti) ){
        saacproto_ACCharSave_send( ti , FAILED , "not login" , mesgid );
        return;
    }
#ifdef _NewSave
    ret = charSave( ti, id, charname, opt, charinfo,
                      unlock,mesgid, charindex );
#else
    ret = charSave( ti, id, charname, opt, charinfo,
                      unlock,mesgid );
#endif
    snprintf( process , sizeof(process) , "%d" , ret );
//	log( "unlock:%d, process:%s\n", unlock, process);
    if( unlock) {
			dummyCallback(ti,0,id,"dummy",charname,process,"",mesgid,0);
    }
    log("玩家已保存保存\n");
}

void saacproto_ACCharList_recv( int ti,char* id,char* pas , int mesgid)
{
    static int process=0;
    char buf[10];

	//log(" get_charlist ");

    process++;
    if (process > MAX_PROCESS) process=1;
    snprintf(buf, sizeof(buf), "%d", process);

    if( !is_game_server_login( ti ) ){
        saacproto_ACCharList_send( ti , FAILED , "not login" , mesgid );
        return;
    }
		charListCallback(ti,0,id,pas,"",buf,"0",mesgid,0);
    log( "档案列表: %s\n", id );
}

void saacproto_ACCharDelete_recv( int ti,char* id,char* pas,
                                  char* charname , char *option , int mesgid)
{

    if( !is_game_server_login(ti) ){
        saacproto_ACCharDelete_send( ti , FAILED , "not login" , mesgid );
        return;
    }
    // Nuke
    charDeleteCallback(ti,0,id,pas,charname,"0","",mesgid,0);
    log( "档案删除: 附加作业 %s %s\n",id , pas );
}

void saacproto_ACLock_recv( int ti ,char* id,int lock,int mesgid )
{
	if( !is_game_server_login(ti) ){
		saacproto_ACLock_send( ti , FAILED , "not login" , mesgid );
		return;
	}
	// Arminius 7.25 test unlock
	log("ACLock recv:%d\n",lock);
  if (lock==2) {
		char buf[4096];
		if (GetMemLockState(getHash(id) & 0xff, id, buf)) {
			sprintf(retdata, "USRLOCKED:%s", buf);
		} else {
			sprintf(retdata, "USRUNLOCKED:%s", buf);
		}
		log(retdata);
    } else if (lock==3) {
			int proc;
			if (DeleteMemLock(getHash(id) & 0xff, id, &proc)) {
				sprintf(retdata, "GMUNLOCKSUCCESS");
			} else {
				sprintf(retdata, "GMUNLOCKFAIL");
			}
			log(retdata);
		} else if (lock==4) {
			DeleteMemLockServer(id);
			sprintf(retdata, "GMUNLOCKALL");
    } else {
			if ( lockUser( getGSName( ti ) , id , "0" , lock , result,sizeof(result),
										retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
			log( "锁定用户: %s 失败\n" , id );
		} else {
			log( "锁定用户: %s 成功\n" , id );
		}
  }
    // Spock end
  saacproto_ACLock_send( ti , result , retdata , mesgid );
}

void saacproto_ACUCheck_recv( int ti , char *id , int status )
{
    if( !is_game_server_login(ti) ){
        log( "服务器发现账号:%s status:%d\n",
             id, status );
        return;
    }

	if( status == 0 ){
       log( "用户 %s 在 %s 并未锁定!\n", id , getGSName( ti ) );
       saacproto_ACKick_recv( ti, id, 6, -1);
    } else {
        log( "用户 %s 在 %s 已锁定!\n", id , getGSName( ti ) );
#ifdef _WAEI_KICK
				saacproto_ACKick_recv( ti, id, 1, -1);
#endif
    }
}



void saacproto_DBUpdateEntryString_recv( int fd,
                                         char* table,
                                         char* key,
                                         char* value,
                                         int msgid,
                                         int msgid2 )
{
    int r;
    r = dbUpdateEntryString( table, key, value );

	if( r != 0 ){
		log( "failed: DBUpdateEntryString err !!\n");
	}
/* 2003/06/26
    if( r == 0 ){
//        saacproto_DBUpdateEntryString_send( fd, SUCCESSFUL,table,key,
                                            msgid,msgid2 );
    } else {
//        saacproto_DBUpdateEntryString_send( fd, FAILED,table,key,
                                            msgid,msgid2 );        
    }
*/
}


void saacproto_DBDeleteEntryString_recv( int fd,
                                         char* table,
                                         char* key,
                                         int msgid,
                                         int msgid2 )
{
    int r;

    r = dbDeleteEntryString( table,key );
    if( r == 0 ){
        saacproto_DBDeleteEntryString_send( fd,SUCCESSFUL,table,key,
                                            msgid,msgid2 );
    } else {
        saacproto_DBDeleteEntryString_send( fd,FAILED,table,key,
                                            msgid,msgid2 );        
    }
}


void saacproto_DBGetEntryString_recv( int fd,
                                      char* table,
                                      char* key,
                                      int msgid,
                                      int msgid2 )
{
    char output[16384];
    int r;
    r = dbGetEntryString( table, key, output, sizeof( output) );
    if( r == 0 ){
        saacproto_DBGetEntryString_send( fd,SUCCESSFUL,output,table,key,
                                         msgid,msgid2 );
    } else {
        saacproto_DBGetEntryString_send( fd,FAILED,"",table,key,
                                         msgid,msgid2 );        
    }
    
}



void saacproto_DBUpdateEntryInt_recv( int fd,
                                   char* table,
                                   char* key,
                                   int value,
                                   char *info,
                                   int msgid,
                                   int msgid2)
{
    if( !is_game_server_login(fd) ){
        saacproto_DBUpdateEntryInt_send( fd, FAILED, "","",msgid, msgid2 );
        return;
    }    
    if( dbUpdateEntryInt( table , key , value, info ) == 0 ){
        saacproto_DBUpdateEntryInt_send(
            fd , SUCCESSFUL ,table,key, msgid, msgid2 );
    } else {
        saacproto_DBUpdateEntryInt_send( fd , FAILED , table,key, msgid, msgid2 );        
    }
}

#ifdef _ALLDOMAN					// (不可开) Syu ADD 排行榜NPC
void saacproto_UpdataStele_recv( int fd , char *cdkey , char *name , char *title ,
								int level , int trns , int time , int floor )
{
	int i, min=140, minnum=-1, nameflag=-1;
	for ( i=0; i atoi(Herolist[nameflag][6]) ) {
		Send_S_herolist ( Herolist[nameflag][0] , Herolist[nameflag][1] , 
			cdkey , name , title , level , trns , floor ) ; 
		sprintf ( Herolist[nameflag][2] , "%s" , title ) ; 
		sprintf ( Herolist[nameflag][3] , "%d" , level ) ; 
		sprintf ( Herolist[nameflag][4] , "%d" , trns ) ; 
		sprintf ( Herolist[nameflag][5] , "%d" , time ) ; 
		sprintf ( Herolist[nameflag][6] , "%d" , floor ) ; 
		SAVE_herolist( fd );
	}else if ( nameflag == -1 && floor > min ) {
		Send_S_herolist ( Herolist[minnum][0] , Herolist[minnum][1] , 
			cdkey , name , title , level , trns , floor ) ; 
		sprintf ( Herolist[minnum][0] , "%s" , cdkey ) ; 
		sprintf ( Herolist[minnum][1] , "%s" , name  ) ; 
		sprintf ( Herolist[minnum][2] , "%s" , title ) ; 
		sprintf ( Herolist[minnum][3] , "%d" , level ) ; 
		sprintf ( Herolist[minnum][4] , "%d" , trns ) ; 
		sprintf ( Herolist[minnum][5] , "%d" , time ) ; 
		sprintf ( Herolist[minnum][6] , "%d" , floor ) ; 
		SAVE_herolist( fd );
	}
}
#endif

void saacproto_DBGetEntryRank_recv( int fd,
                                    char* table,
                                    char* key,
                                    int msgid,
                                    int msgid2)
{
    int rk,c;

    if( !is_game_server_login(fd) ){
        saacproto_DBGetEntryRank_send( fd, FAILED, 0,0,"","",msgid, msgid2 );
        return;
    }
    
    dbGetEntryRank( table, key , &rk, &c );
    if( rk <0 ){
        saacproto_DBGetEntryRank_send(
            fd, FAILED, -1, -1, table, key, msgid, msgid2 );
    } else {
        saacproto_DBGetEntryRank_send( fd, SUCCESSFUL,
                                       rk, c, table, key, msgid, msgid2 );
    }
}


void saacproto_DBDeleteEntryInt_recv( int fd,
                                   char* table,
                                   char* key,
                                   int msgid,
                                   int msgid2)
{
    if( !is_game_server_login(fd) ){
        saacproto_DBDeleteEntryInt_send( fd, FAILED,"","",msgid, msgid2 );
        return;
    }
    
    if( dbDeleteEntryInt( table, key ) < 0 ){
        saacproto_DBDeleteEntryInt_send(
            fd, FAILED, table, key, msgid, msgid2 );
    } else {
        saacproto_DBDeleteEntryInt_send(
            fd, SUCCESSFUL, table, key, msgid, msgid2 );
    }
}
    

void saacproto_DBGetEntryInt_recv( int fd,
                                char* table,
                                char* key,
                                int msgid,
                                int msgid2)
{
    int r ;
    int output;

    if( !is_game_server_login(fd) ){
        saacproto_DBGetEntryInt_send( fd, FAILED,-1,"","",msgid, msgid2 );
        return;
    }
    
    r = dbGetEntryInt( table, key, &output );
    
    if( r < 0 ){
        saacproto_DBGetEntryInt_send( fd,
                                      FAILED, -1, table, key, msgid, msgid2);
    } else {
        saacproto_DBGetEntryInt_send(
            fd, SUCCESSFUL, output, table, key, msgid, msgid2 );
    }

}


void saacproto_DBGetEntryByRank_recv( int fd,
                                char* table,
                                int start, int end,
                                int msgid ,
                                int msgid2)
{
    char output[16384];
    int r;

    if( !is_game_server_login(fd) ){
        saacproto_DBGetEntryByRank_send( fd, FAILED,"","",msgid, msgid2 );
        return;
    }
    
    r = dbGetEntryRankRange( table, start, end, output, sizeof( output ));

    if( r < 0 ){
        saacproto_DBGetEntryByRank_send(
            fd, FAILED, "", table, msgid, msgid2 );
    } else {
        saacproto_DBGetEntryByRank_send(
            fd, SUCCESSFUL, output,table, msgid, msgid2 );
    }
}

void saacproto_DBGetEntryByCount_recv( int fd,
                                       char* table,
                                       int count_start,
                                       int num,
                                       int msgid ,
                                       int msgid2)
{
    char output[16384];
    int r;

    if( !is_game_server_login(fd) ){
        saacproto_DBGetEntryByCount_send(
            fd, FAILED,"",table,count_start,msgid, msgid2 );
        return;
    }
    
    r = dbGetEntryCountRange( table, count_start, num, output, sizeof(output));

    if( r < 0 ){
        saacproto_DBGetEntryByCount_send( fd, FAILED, "", table,
                                          count_start, msgid, msgid2 );
    } else {
        saacproto_DBGetEntryByCount_send( fd, SUCCESSFUL, output, table,
                                          count_start,  msgid, msgid2 );       
    }
}

void saacproto_Broadcast_recv( int fd, char* id, char* charname, char* message, int flag)
{
    if( !is_game_server_login( fd) ){
        log( "Broadcast: no login. id:%s charname:%s message:%s flag:%d\n",
             id, charname, message , flag );
        return;
    }
    gmsvBroadcast( fd, id, charname, message , flag );
}


void saacproto_Message_recv( int fd,
                             char* id_from,
                             char* charname_from,
                             char* id_to,
                             char* charname_to,
                             char* message,
                             int option )
{
    receiveMail( id_from, charname_from,
                       id_to, charname_to, message, option ,0,0);
}

void saacproto_MessageAck_recv( int fd,
                                char* id,
                                char* charname,
                                char* result,
                                int mesgid )
{
    int a;
    if( strcmp( result, SUCCESSFUL ) )a=0; else a =-1;
    receiveMailAck( id, charname, a , mesgid );
}

void saacproto_MessageFlush_recv( int fd,
                                  char* id,
                                  char* charname )
{
    flushMail( fd, id , charname );
}

/*******************************************************
 * CoolFish: Family 2001/5/18
 ******************************************************/
#ifdef _PERSONAL_FAME
void saacproto_ACAddFM_recv( int fd, char *fmname, char *fmleadername,
	char *fmleaderid, int fmleaderlv, char *petname, char *petattr,
	char *fmrule, int fmsprite, int fmleadergrano, int fame, int charfdid)
#else
void saacproto_ACAddFM_recv( int fd, char *fmname, char *fmleadername,
	char *fmleaderid, int fmleaderlv, char *petname, char *petattr,
	char *fmrule, int fmsprite, int fmleadergrano, int charfdid)
#endif
{
#ifdef _FAMILY
	int r = 0, index = 0;
#ifdef _PERSONAL_FAME
	r = ACAddFM(fd, &index, fmname, fmleadername, fmleaderid, fmleaderlv,
	   petname, petattr, fmrule, fmsprite, fmleadergrano, fame, charfdid);
#else
	r = ACAddFM(fd, &index, fmname, fmleadername, fmleaderid, fmleaderlv,
	   petname, petattr, fmrule, fmsprite, fmleadergrano, charfdid);
#endif
	if (r < 0){
		saacproto_ACAddFM_send(fd, FAILED, r, index, charfdid);
	}else{
		saacproto_ACAddFM_send(fd, SUCCESSFUL, r, index, charfdid);
	}
#endif
}

void saacproto_ACJoinFM_recv(int fd, char *fmname, int fmindex,
#ifdef _PERSONAL_FAME	// Arminius: 家族个人声望
	char *charname, char *charid, int charlv, int index, int fame, int charfdid)
#else
	char *charname, char *charid, int charlv, int index, int charfdid)
#endif
{
#ifdef _FAMILY
	int r = 0;
#ifdef _PERSONAL_FAME	// Arminius: 家族个人声望
	r =  ACJoinFM(fd, index, fmname, fmindex, charname, charid, charlv, fame, charfdid);
#else
	r =  ACJoinFM(fd, index, fmname, fmindex, charname, charid, charlv, charfdid);
#endif
	if (r < 0){
		saacproto_ACJoinFM_send(fd, FAILED, r, charfdid);
	}else{
		saacproto_ACJoinFM_send(fd, SUCCESSFUL, r, charfdid);
	}
#endif
}

void saacproto_ACLeaveFM_recv(int fd, char *fmname, int fmindex,
	char *charname, char *charid, int index, int charfdid)
{
#ifdef _FAMILY
	int r = 0;
	r =  ACLeaveFM(index, fmname, fmindex, charname, charid);
	if (r < 0){
		saacproto_ACLeaveFM_send(fd, FAILED, r, charfdid);
	}else{
		saacproto_ACLeaveFM_send(fd, SUCCESSFUL, r, charfdid);
	}
#endif
}

#ifdef _LEADERFUNCHECK
void saacproto_ACDelFM_recv(int fd, char *fmname, int fmindex,
	int index, char *charname, char *charid, int charfdid)
{
	int r = 0, result = 0;
	result = CheckLeaderQ(index, fmname, fmindex, charname, charid);
	if(result < 0)
	{
		saacproto_ACDelFM_send(fd, FAILED, charfdid);
		return;
	}
	// shan modify begin
	// original
	/*if (ChangeFMLeader(index, fmname, fmindex) < 0)    
		r = ACDelFM(index, fmname, fmindex); 
	else 
		r = -1;  // shan  1 -> -1
	if (r < 0)
		saacproto_ACDelFM_send(fd, FAILED, charfdid);
	else
		saacproto_ACDelFM_send(fd, SUCCESSFUL, charfdid);
	*/   
	r = ACDelFM(index, fmname, fmindex); 	
	if (r < 0)
		saacproto_ACDelFM_send(fd, FAILED, charfdid);
	else
		saacproto_ACDelFM_send(fd, SUCCESSFUL, charfdid);
	// shan end
}
#else
void saacproto_ACDelFM_recv(int fd, char *fmname, int fmindex,
	int index, int charfdid)
{
#ifdef _FAMILY
	int r = 0;
#ifdef _FMVER21
	if (ChangeFMLeader(index, fmname, fmindex) >= 0)
		r = ACDelFM(index, fmname, fmindex);
	else r = 1;
#else
	r =  ACDelFM(index, fmname, fmindex);
#endif	
	if (r < 0){
		saacproto_ACDelFM_send(fd, FAILED, charfdid);
	}
#ifdef _FMVER21
	else if (r == 1){
	}
#endif
	else{
		saacproto_ACDelFM_send(fd, SUCCESSFUL, charfdid);
	}
#endif
}
#endif

void saacproto_ACShowFMList_recv(int fd)
{
#ifdef _FAMILY
	int r = 0;
	char data[150 * MAX_FAMILY];
	r =  ACShowFMList(data);
	if (r < 0){
//		saacproto_ACShowFMList_send(fd, FAILED, r, "Nothing");
	}else{
		saacproto_ACShowFMList_send(fd, SUCCESSFUL, r, data);
	}
#endif
}

void saacproto_ACShowMemberList_recv(int fd, int index)
{
#ifdef _FAMILY
	int r = 0, fmacceptflag = 0, fmjoinnum = 0;
	char data[150 * MAX_MEMBERNUM];
	r =  ACShowFMMemberList(index, &fmacceptflag, &fmjoinnum, data);
	if (r < 0){
//		saacproto_ACShowMemberList_send(fd, FAILED, index, r,
//			fmacceptflag, fmjoinnum, "Nothing");
	}else{
		saacproto_ACShowMemberList_send(fd, SUCCESSFUL, index, r,
			fmacceptflag, fmjoinnum, data);
	}
#endif
}

void saacproto_ACFMDetail_recv(int fd, char *fmname,
	int fmindex, int index, int charfdid)
{
#ifdef _FAMILY
	int r = 0;
	char data[15000];
	r =  ACFMDetail(index, fmname, fmindex, data);
	if (r < 0){
//		saacproto_ACFMDetail_send(fd, FAILED, "Nothing", charfdid);
	}else{
		saacproto_ACFMDetail_send(fd, SUCCESSFUL, data, charfdid);
	}
#endif
}

#ifdef _FMVER21
void saacproto_ACMemberJoinFM_recv(int fd, char *fmname, int fmindex,
	char *charname, int charindex, int index, int result, int meindex,
	int charfdid)
#else
void saacproto_ACMemberJoinFM_recv(int fd, char *fmname, int fmindex,
	char *charname, int charindex, int index, int result, int charfdid)
#endif
{
	int r = 0;
#ifdef _FMVER21
   	r =  ACMemberJoinFM(index, fmname, fmindex, charname, charindex, result, meindex);
#else
	r =  ACMemberJoinFM(index, fmname, fmindex, charname, charindex);
#endif		
	if (r < 0){
		saacproto_ACMemberJoinFM_send(fd, FAILED, charfdid);
	}else{
		saacproto_ACMemberJoinFM_send(fd, SUCCESSFUL, charfdid);
	}
}

#ifdef _FMVER21
void saacproto_ACMemberLeaveFM_recv(int fd, char *fmname, int fmindex,
	char *charname, int charindex, int index, int meindex, int charfdid)
#else
void saacproto_ACMemberLeaveFM_recv(int fd, char *fmname, int fmindex,
	char *charname, int charindex, int index, int charfdid)
#endif
{
#ifdef _FAMILY
	int r = 0;
	int flag = 1; // 主动离开家族
#ifdef _FMVER21
	r =  ACMemberLeaveFM(index, fmname, fmindex, charname, flag,
		charindex, meindex);
#else
	r =  ACMemberLeaveFM(index, fmname, fmindex, charname, flag, charindex);
#endif
	if (r < 0){
		saacproto_ACMemberLeaveFM_send(fd, FAILED, charfdid);
	}else{
		saacproto_ACMemberLeaveFM_send(fd, SUCCESSFUL, charfdid);
	}
#endif
}

#ifdef _FMVER21
void saacproto_ACFMCharLogin_recv(int fd, char *fmname, int fmindex,
	char *charname, char *charid, int charlv, int eventflag, int charfdid)
#else
void saacproto_ACFMCharLogin_recv(int fd, char *fmname, int fmindex,
	char *charname, char *charid, int charlv, int charfdid)
#endif
{
#ifdef _FAMILY
	int r = 0, floor = 0, fmpopular = 0, joinflag = 0, fmsetupflag = 0;
	int flag = 0, charindex = 0;
#ifdef _PERSONAL_FAME   // Arminius: 家族个人声望
	int charfame = 0;
#endif
#ifdef _PERSONAL_FAME   // Arminius: 家族个人声望
	r =  ACFMCharLogin(fd, -1, fmname, fmindex, charname, charid, charlv,
			&floor, &fmpopular, &joinflag, &fmsetupflag, &charindex, charfdid,
			&charfame, eventflag);
#else
	r =  ACFMCharLogin(fd, -1, fmname, fmindex, charname, charid, charlv,
			&floor, &fmpopular, &joinflag, &fmsetupflag, &charindex, charfdid);
#endif
#endif

#ifdef _PERSONAL_FAME   // Arminius: 家族个人声望
	if (r < 0){
		saacproto_ACFMCharLogin_send(fd, FAILED, r, floor, fmpopular,
			joinflag, fmsetupflag, flag, charindex, charfame, charfdid
		);
	}else{
		saacproto_ACFMCharLogin_send(fd, SUCCESSFUL, r, floor, fmpopular,
			joinflag, fmsetupflag, flag, charindex, charfame, charfdid
		);
	}
#else
	if (r < 0){
		saacproto_ACFMCharLogin_send(fd, FAILED, r, floor, fmpopular,
			joinflag, fmsetupflag, flag, charindex, charfdid);
	}else{
		saacproto_ACFMCharLogin_send(fd, SUCCESSFUL, r, floor, fmpopular,
			joinflag, fmsetupflag, flag, charindex, charfdid);
	}
#endif
}

void saacproto_ACFMCharLogout_recv(int fd, char *fmname, int fmindex,
	char *charname, char *charid, int charlv, int index,int charfdid)
{
#ifdef _FAMILY
	int r = 0;
	r =  ACFMCharLogout(index, fmname, fmindex, charname, charid, charlv,
		charfdid);
	if (r < 0){
		saacproto_ACFMCharLogout_send(fd, FAILED, charfdid);
	}else{
		saacproto_ACFMCharLogout_send(fd, SUCCESSFUL, charfdid);
	}
#endif
}

void saacproto_ACFMReadMemo_recv(int fd, int index)
{

#ifdef _FAMILY
	int r = 0, dataindex;
	char data[15000];
	r =  ACFMReadMemo(index, &dataindex, data);
	if (r < 0){
//		saacproto_ACFMReadMemo_send(fd, FAILED, index, r, dataindex, "Nothing");
	}else{
		saacproto_ACFMReadMemo_send(fd, SUCCESSFUL, index, r, dataindex, data);
	}
#endif

}
                
void saacproto_ACFMWriteMemo_recv(int fd, char *fmname, int fmindex,
	char *data, int index)
{
#ifdef _FAMILY
	int r = 0;
	r =  ACFMWriteMemo(index, fmname, fmindex, data);
	if (r < 0){
		saacproto_ACFMWriteMemo_send(fd, FAILED, index);
	}else{
		saacproto_ACFMWriteMemo_send(fd, SUCCESSFUL, index);
	}
#endif
}

void saacproto_ACFMPointList_recv(int fd)
{
#ifdef _FAMILY
        int r = 0;
        char data[15000];
        r =  ACFMPointList(data);
        if (r < 0)
        {
//        	saacproto_ACFMPointList_send(fd, FAILED, "nothing");
        }else{
        	saacproto_ACFMPointList_send(fd, SUCCESSFUL, data);
        }
#endif
}

void saacproto_ACSetFMPoint_recv(int fd, char *fmname, int fmindex, 
	int index, int fmpointindex, int fl, int x, int y, int charfdid)
{
#ifdef _FAMILY
	int r = 0;
	r =  ACSetFMPoint(index, fmname, fmindex, fmpointindex, fl, x, y);
	if (r < 0){
		saacproto_ACSetFMPoint_send(fd, FAILED, r, charfdid);
	}else{
		saacproto_ACSetFMPoint_send(fd, SUCCESSFUL, r, charfdid);
	}
#endif
}

void saacproto_ACFixFMPoint_recv(int fd, char *winfmname, int winfmindex, int winindex,
	char *losefmname, int losefmindex, int loseindex, int village)
{
#ifdef _FAMILY
	int r = 0;
	r =  ACFixFMPoint(winindex, winfmname, winfmindex,
		loseindex, losefmname, losefmindex, village);
	if (r < 0){
		saacproto_ACFixFMPoint_send(fd, FAILED, r);
	}else{
		saacproto_ACFixFMPoint_send(fd, SUCCESSFUL, r);
	}
#endif
}

void saacproto_ACFMAnnounce_recv(int fd, char *fmname, int fmindex, int index,
        char *data, int color)
{
#ifdef _FAMILY
	int r = 0, i = 0;
	r = ACFMAnnounce(fmname, fmindex, index, data, color);
	if (r < 0){
		saacproto_ACFMAnnounce_send(fd, FAILED, fmname, fmindex, index,
			1, data, color);
	}else{
		extern gmsv gs[MAXCONNECTION];
		for (i = 0; i < MAXCONNECTION; i ++)
		{
		   if (gs[i].use && gs[i].name[0])
		   {
		      saacproto_ACFMAnnounce_send(i, SUCCESSFUL, fmname, fmindex,
		      	index, 1, data, color);
		   }
		}
	}	
#endif
}

void saacproto_ACShowTopFMList_recv(int fd, int kindflag)
{
#ifdef _FAMILY
	int r = 0;
	char data[150 * MAX_FAMILY];
	strcpy(data, "");
	r =  ACShowTopFMList(data, sizeof(data), kindflag);
	if (r < 0)	{
//		saacproto_ACShowTopFMList_send(fd, FAILED, kindflag, r, "Nothing");
	}else	{
		saacproto_ACShowTopFMList_send(fd, SUCCESSFUL, kindflag, r, data);
	}
#endif
}

void saacproto_ACFixFMData_recv(int fd, char *fmname, int fmindex, int index,
	int kindflag, char *data1, char *data2, int charindex, int charfdid)
{
#ifdef _FAMILY
	int r = 0;
	r =  ACFixFMData(index, fmname, fmindex, kindflag, charindex, data1, data2);
	if (r < 0){
		saacproto_ACFixFMData_send(fd, FAILED, kindflag, data1, data2, charfdid);
	}else{
		saacproto_ACFixFMData_send(fd, SUCCESSFUL, kindflag, data1, data2, charfdid);
	}
#endif
}

void saacproto_ACFixFMPK_recv(int fd, char *winfmname, int winfmindex, int winindex,
	char *losefmname, int losefmindex, int loseindex)
{
#ifdef _FAMILY
	int r = 0;
	r =  ACFixFMPK(winindex, winfmname, winfmindex,
		loseindex, losefmname, losefmindex);
	if (r < 0){
		saacproto_ACFixFMPK_send(fd, FAILED, r, winindex,
			loseindex);
	}else{
		saacproto_ACFixFMPK_send(fd, SUCCESSFUL, r, winindex,
			loseindex);
	}
#endif
}

void saacproto_ACGMFixFMData_recv(int fd, int index, char *charid, char *cmd,
	char *data, int charfdid)
{
#ifdef _FAMILY
	int r = 0;
	char fmname[256];
	r =  ACGMFixFMData(index, fmname, charid, cmd, data);
	if (r < 0){
		saacproto_ACGMFixFMData_send(fd, FAILED, fmname, charfdid);
	}
	else{
		saacproto_ACGMFixFMData_send(fd, SUCCESSFUL, fmname, charfdid);
	}
#endif
}

void saacproto_ACGetFMData_recv(int fd, char *fmname, int fmindex, int index,
	int kindflag, int charfdid)
{
#ifdef _FAMILY
	int r = 0, data = 0;
	r =  ACGetFMData(index, fmname, fmindex, kindflag, &data);
	if (r < 0){
		saacproto_ACGetFMData_send(fd, FAILED, kindflag, data, charfdid);
	}else{
		saacproto_ACGetFMData_send(fd, SUCCESSFUL, kindflag, data, charfdid);
	}
#endif
}

void saacproto_ACreLoadFmData_recv(int fd, int type, int data)
{
	int i=0;
extern gmsv gs[MAXCONNECTION];
	switch( type){
	case 1:
		log( "reload FM_DATA:%d !\n", data);
		readOneFamilyFromTi( data);
		break;
	case 2:
		{
			char data[15000];
			readFMPoint( fmpointdir);
			if( ACFMPointList( data) >= 0 ){
				log( "reload FM_POINT !\n" );
				for (i=0; i MAX_FMPOINT) return;
	saacproto_ACLoadFmPk_send( fd, FMPK_GetData( fmpks_pos-1) );
}

void saacproto_ACSendFmPk_recv(int fd, int fmpks_pos, int userindex, int flg, char *data)
{
	extern  gmsv gs[MAXCONNECTION];
	char buf[1024];
	int i=0;
	sprintf( buf, "%d|%s", fmpks_pos, data);

	if( ( userindex != -1 && FMPK_GetTypeFlg( fmpks_pos-1) == 1 )||
		FMPK_SetData( fmpks_pos-1, flg, buf, strlen( buf)) != 1 ){
		if(userindex != -1) saacproto_ACSendFmPk_send( fd, userindex, 0);
		log("err ACSendFmPk_send(%d, %d)\n", userindex, 0);
		return;
	}
	FMPK_BackUpList();
	for (i=0; i MAX_FMPOINT){
		log("\n fmpks_pos(%d) too big", fmpks_pos);
	}	
	saacproto_ACLoadFmPk_send(fd, fm_pk_list[fmpks_pos-1]);
}
void saacproto_ACSendFmPk_recv(int fd, int fmpks_pos, char *data)
{
	extern  gmsv gs[MAXCONNECTION];
	int i=0;

	if( (fmpks_pos>MAX_FMPOINT) || (fmpks_pos<1) ){
		log("\n fmpks_pos(%d) err !!", fmpks_pos);
	}		
	sprintf(fm_pk_list[fmpks_pos-1], "%d|%s", fmpks_pos, data);

	for (i=0; i= 65535 ){
				saacproto_UpdataStele_send ( fd , token );
				memset( token, 0, sizeof(token));
				lens = 0;
			}
			strcat( token, buf);
			lens += strlen( buf);
		}
		fclose ( fdb );
		if( strlen( token) > 0 )
			saacproto_UpdataStele_send ( fd , token ); 
	}
}

void Send_S_herolist( char *ocdkey , char *oname , char *ncdkey , char *nname , 
					 char *title , int level , int trns , int floor ) 
{
	int i;
    extern gmsv gs[MAXCONNECTION];

	for (i = 0 ; i < MAXCONNECTION ; i ++ ) {
		if ( gs[i].use && gs[i].name[0] ) {
			saacproto_S_UpdataStele_send( i , ocdkey , oname ,
				ncdkey , nname , title
				, level , trns , floor );
			log("\nSyu log AC Send Single to Gmsv ");
		}
	}		
}
#endif

#define MAXUNlockM 50
#define delaytime (60*3)
UNLockMenus UNlockM[MAXUNlockM];

int UNlockM_Init( void)
{
	int i;
	for( i=0; i= time(NULL) ) continue;
		if( isLocked( UNlockM[i].PlayerId ) ){
			log( "等待解锁玩家: %s 还需锁定!!\n", UNlockM[i].PlayerId);
		}else{
			log( "等待解锁玩家: %s 已经解锁!!\n", UNlockM[i].PlayerId);
		}
		reset_UNlockMPlayer( i);
		nums++;
	}
	//log( "等待解锁玩家: 总计 %d 个用户解锁 !!\n", nums);
	return nums;
}

void saacproto_ACCharLogin_recv( int fd, int clifd, char* id, char* pas, char* ip )
{
	int res;
	
#ifdef _SASQL
	if (strlen(id)==0 || strlen(pas)==0 || strlen(ip)==0){
	  printf("登陆信息有错误!\n");
	  saacproto_ACCharLogin_send( fd, clifd, 0);
	  return;
	}
	if (sasql_chehk_lock(id)){
		printf("该账号%s禁止登陆!\n",id);
	  saacproto_ACCharLogin_send( fd, clifd, 0);
	  return;
	}
	if (sasql_chehk_lock(ip)){
		printf("该IP%s禁止登陆!\n",ip);
	  saacproto_ACCharLogin_send( fd, clifd, 0);
	  return;
	}
	res=sasql_query(id,pas);
	printf("res:%d\n",res);
	if (res==3){
#ifdef _SQL_REGISTER
		if(!sasql_register(id,pas))
#endif
		{
			saacproto_ACCharLogin_send( fd, clifd, 0);
	  	return;
		}
	}else if (res!=1){
		saacproto_ACCharLogin_send( fd, clifd, 0);
	  return;
	}
#endif
	saacproto_ACCharLogin_send( fd , clifd, 1);
}

#ifdef _SASQL
void saacproto_LockLogin_recv( int fd, char* id, char* ip, int flag )
{
	switch (flag){
		case 0:
			if(strlen(id)>0)
				if(sasql_del_lock(id))
					log("成功解除锁定账号:%s\n",id);
			if(strlen(ip)>0)
				if(sasql_del_lock(ip))
					log("成功解除锁定IP:%s\n",ip);
			break;
		case 1:
			if(strlen(id)>0)
				if(!sasql_chehk_lock(id))
					if(sasql_add_lock(id))
						log("成功锁定账号:%s\n",id);
			if(strlen(ip)>0)
				if(!sasql_chehk_lock(ip))
					if(sasql_add_lock(ip))
						log("成功锁定IP:%s\n",ip);
			break;
		default:
			break;
	}
}
#endif