StoneAge/saac/recv.c
2018-08-07 00:51:35 -07:00

3267 lines
85 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#define _RECV_C_
#include "version.h"
#include "main.h"
#include "saacproto_util.h"
#include "saacproto_serv.h"
#include "saacproto_lserver.h"
#include "saacproto_work.h"
#include "recv.h"
#include "char.h"
#include "db.h"
#include "mail.h"
#include "lock.h"
#include "util.h"
#ifdef _SASQL1
#include "sasql.h"
#endif
// CoolFish: Family 2001/5/9
#include "acfamily.h"
#include "version.h"
#include <stdlib.h>
#include <stdio.h>
#ifdef _PAUCTION_MAN
#include "auction.h"
#endif
#ifdef _DEATH_CONTEND
#include "deathcontend.h"
#endif
#include "defend.h"
#ifdef _UNIVERSE_CHATROOM
#include "chatroom.h"
#endif
#ifdef _RECAL_BACKUP_PLAYER // WON 回溯功能
#include <dirent.h>
#include <sys/stat.h>
#define MAX_HAVE_ITEM 20
#define MAX_POOL_ITEM 30
#define MAX_HAVE_PET 5
#define MAX_POOL_PET 20
static int char_data_count=0;
#endif
#ifdef _CK_ONLINE_PLAYER_COUNT // WON ADD 计算线上人数
struct play_count
{
int playcount;
};
struct play_count online_player[MAXCONNECTION];
#endif
char retdata[CHARDATASIZE];
char result[CHARDATASIZE];
// Spock +1 2000/11/1
#define MAX_PROCESS 16777216
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 );
}
/*
必□丞扔□田□互失市它件玄扔□田□井日夫弘失它玄允月[
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 (!sasql_query(id,pas)){
if(!sasql_register(id,pas)){
log("密码错误或没有注册\n");
saacproto_ACCharList_send( ti , FAILED , "Password error" , mesgid);
return;}}
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;
}
#ifdef _CHANGEGALAXY
if( isChangeGalaxyLocked( id) ) {
log(" 因星系移民被锁 ");
saacproto_ACCharLoad_send( ti , FAILED , "CHANGE_GALAXY" , mesgid, charindex );
return;
}
#endif
#ifdef _UNLOCKPOOL // 登入时检查是否已在UnlockPool中
if( inUnlockPool(id) ) {
log(" 已经在UNLOCKPOOL中 ");
saacproto_ACCharLoad_send( ti , FAILED ,
"server load too high" , mesgid , charindex);
return;
}
#endif
process++;
if ( process > MAX_PROCESS ) process = 1;
snprintf( buf , sizeof(buf) , "%d" , process );
if( addWorkerTask( id, pas , "2", charLoadCallback , ti ,
id , pas , charname , buf , "" , lock, mesgid) < 0 ){
#ifdef _NewSave
saacproto_ACCharLoad_send( ti , FAILED ,
"server load too high" , mesgid , charindex);
#else
saacproto_ACCharLoad_send( ti , FAILED ,
"server load too high" , mesgid );
#endif
return;
}
// Spock 2000/10/31
//log( "读取档案: 附加作业 %s %s, 进程=%d\n", id,pas,process );
// Spock end
}
#ifdef _RELOGIN
void saacproto_ACCharLoadII_recv( int ti,char* id,char* pas,char* charname ,
int lock,char* opt , int mesgid,int gs1, int gs2)
{
char buf[16];
int charindex = -1;
if( !is_game_server_login( ti ) ){
saacproto_ACCharLoad_send( ti , FAILED , "not login" , mesgid, charindex );
return;
}
// 检查Buffer中的资料是否符合
// 检查原先从Wgs传回CharLoad做了什麽事
// 更新名片资料
}
#endif
/*
平乓仿忡绣
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) {
#ifdef _UNLOCKPOOL
if( addUnlockPool( ti, id, charname, process, mesgid) <0 ) {
#else
if( addWorkerTask( id , "dummy" , "3" , dummyCallback , ti ,
id , "dummy" , charname , process ,"",
mesgid , 0 ) < 0 ) {
#endif
log("游戏退出失败, 进程=%s\n" , process );
} else {
log("游戏退出成功, 进程=%s\n" , process );
}
} else {
log("自动保存\n\n");
}
log("在线玩家保存\n");
}
#ifdef _RELOGIN
void saacproto_ACCharSaveII_recv( int ti, char* id,
char *charname,char* opt ,
char* charinfo , int unlock , int mesgid , int charindex )
{
char process[16];
int ret;
if( !is_game_server_login(ti) ){
saacproto_ACCharSave_send( ti , FAILED , "not login" , mesgid );
return;
}
ret = charSave( ti, id, charname, opt, charinfo,
unlock,mesgid, charindex );
// 储存人物资料
// 记录相关资讯
// 不送GE至WGS
// 不更新名片资料
if (unlock) {
#ifdef _UNLOCKPOOL
if( addUnlockPool( ti, id, charname, process, mesgid) <0 ) {
#else
if( addWorkerTask( id , "dummy" , "3" , dummyCallback , ti ,
id , "dummy" , charname , process ,"",
mesgid , 0 ) < 0 ) {
#endif
log("游戏退出失败, 进程=%s\n" , process );
} else {
log("游戏退出成功, 进程=%s\n" , process );
}
} else {
log("自动保存\n\n");
}
log("在线玩家保存\n");
}
#endif
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);
#ifdef _CHANGEGALAXY
if( isChangeGalaxyLocked( id) ) {
log(" 因星系移民被锁 ");
saacproto_ACCharList_send( ti , FAILED , "CHANGE_GALAXY" , mesgid );
return;
}
#endif
if( !is_game_server_login( ti ) ){
saacproto_ACCharList_send( ti , FAILED , "not login" , mesgid );
return;
}
if( addWorkerTask( id , pas , "1" , charListCallback , ti , id , pas , "", buf ,"0",
mesgid , 0 ) < 0 ){
saacproto_ACCharList_send( ti , FAILED , "server load too high",
mesgid );
return;
}
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;
}
#ifdef _DEATH_FAMILY_LOGIN_CHECK //无法删除人物资料
saacproto_ACCharDelete_send( ti , FAILED , "server load too high",
mesgid );
return;
#endif
#ifdef _DEATH_CONTEND //无法删除人物资料
saacproto_ACCharDelete_send( ti , FAILED , "server load too high",
mesgid );
return;
#endif
// Nuke
if( addWorkerTask( id , pas , "4" , charDeleteCallback , ti ,
id , pas , charname , "0" ,"",
mesgid , 0 ) < 0 ){
saacproto_ACCharDelete_send( ti , FAILED , "server load too high",
mesgid );
return;
}
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 {
#ifdef _LOCK_ADD_NAME
if ( lockUser( getGSName( ti ) , id , "" , "0" , lock , result,sizeof(result),
retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
#else
if ( lockUser( getGSName( ti ) , id , "0" , lock , result,sizeof(result),
retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
#endif
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( "UCHECK: server not logging in: ID:%s status:%d\n",
id, status );
return;
}
if( status == 0 ){
log( "UCHECK: user %s is not locked by %s\n", id , getGSName( ti ) );
#ifdef _DELAY_UNLOCK
//remeber the cdkey into delay unlock list.
if( UNlockM_addPlayer( id) != -1 ){
log( "remeber:[%s] unlock 15min later!!\n", id);
saacproto_ACKick_recv( ti, id, 6, -1); //unlock
}
#ifdef _WAEI_KICK
saacproto_ACKick_recv( ti, id, 1, -1);
#endif
#endif
} else {
log( "UCHECK: user %s is still locked by %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 )
{
#ifdef _FIX_ALLDOMAN
int i, j;
if( !strcmp( cdkey , "FirstLoad") ){
Send_A_herolist( fd );
}else{
for( i=0; i<MAX_HERO_LIST; i++){
if( Herolist[i].use == 0 )continue;
if( !strcmp( Herolist[i].strings[0], cdkey) &&
!strcmp( Herolist[i].strings[1], name) ){
Herolist[i].use = 0;
}
}
for( i=0; i<MAX_HERO_LIST; i++){
if( Herolist[i].use == 0 )continue;
if( floor <= Herolist[i].intdata[3] ) continue;
for( j=MAX_HERO_LIST-1; j>i; j--){ //20031001bug (原j++)
sprintf( Herolist[j].strings[0], "%s", Herolist[j-1].strings[0] );
sprintf( Herolist[j].strings[1], "%s", Herolist[j-1].strings[1] );
sprintf( Herolist[j].strings[2], "%s", Herolist[j-1].strings[2] );
Herolist[j].intdata[0] = Herolist[j-1].intdata[0];
Herolist[j].intdata[1] = Herolist[j-1].intdata[1];
Herolist[j].intdata[2] = Herolist[j-1].intdata[2];
Herolist[j].intdata[3] = Herolist[j-1].intdata[3];
Herolist[j].use = Herolist[j-1].use;
Herolist[j-1].use = 0;
}
sprintf( Herolist[i].strings[0], "%s", cdkey );
sprintf( Herolist[i].strings[1], "%s", name );
sprintf( Herolist[i].strings[2], "%s", title );
Herolist[i].intdata[0] = level;
Herolist[i].intdata[1] = trns;
Herolist[i].intdata[2] = time;
Herolist[i].intdata[3] = floor;
Herolist[i].use = 1;
Send_S_herolist( i);
break;
}
SAVE_herolist( fd);
}
#else
int i, min=140, minnum=-1, nameflag=-1;
for ( i=0; i<MAX_HERO_LIST; i ++ ) {
if( atoi( Herolist[i][6] ) < min ) {
min = atoi (Herolist[i][6]) ;
minnum=i;
}
if ( strcmp ( Herolist[i][0] , cdkey ) == 0 && strcmp ( Herolist[i][1] , name ) == 0 )
nameflag = i ;
}
if( strcmp ( cdkey , "FirstLoad") == 0 &&
strcmp ( name , "LoadHerolist") == 0 &&
floor == 999 )
Send_A_herolist( fd );
else if ( nameflag != -1 && floor > 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
}
#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
}
#ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族战GM指令
void saacproto_ACShowMemberList_2_recv( int fd, int charindex, int fm1, int fm2, int time, int id )
{
char *fm1_name, *fm2_name;
log("\n won test 7.2 ==> fm1(%d) fm2(%d) time(%d) id(%d)", fm1, fm2, time, id );
fm1_name = get_fm_leader_index( fm1 );
fm2_name = get_fm_leader_index( fm2 );
log("\n won test 7.3 ==> fm1_name(%s) fm2_name(%s)", fm1_name, fm2_name );
saacproto_ACSHOWMEMBERLIST_2_send( fd, charindex, fm1, fm1_name, fm2, fm2_name, time, id );
}
#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 _FM_MODIFY
void saacproto_ACFMCharLogin_recv(int fd, char *fmname, int fmindex,
char *charname, char *charid, int charlv, int eventflag, int charfdid,int gsnum)
#else
#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
#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 _NEW_MANOR_LAW
int momentum = 0;
#endif
#ifdef _FM_MODIFY
r = ACFMCharLogin(fd, -1, fmname, fmindex, charname, charid, charlv,
&floor, &fmpopular, &joinflag, &fmsetupflag, &charindex, charfdid,
&charfame, eventflag,gsnum
#ifdef _NEW_MANOR_LAW
,&momentum
#endif
);
#else
#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
#ifdef _NEW_MANOR_LAW
,momentum
#endif
);
}else{
saacproto_ACFMCharLogin_send(fd, SUCCESSFUL, r, floor, fmpopular,
joinflag, fmsetupflag, flag, charindex, charfame, charfdid
#ifdef _NEW_MANOR_LAW
,momentum
#endif
);
}
#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
#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
}
#ifdef _CK_ONLINE_PLAYER_COUNT // WON ADD 计算线上人数
void PlayerCount(void)
{
int i, total_count=0;
char msg[64], out_msg[1024];
FILE *fpcount;
extern gmsv gs[MAXCONNECTION];
strcpy(out_msg, "");
for(i=0; i<MAXCONNECTION; i++){
if( gs[i].use ){
sprintf(msg, "%s:%d Item ratio-->0%%\n", gs[i].name, online_player[i].playcount );
strcat( out_msg, msg );
total_count += online_player[i].playcount;
}
}
sprintf(msg, "-----------------------\n");
strcat( out_msg, msg );
sprintf(msg, "Total:%d\n", total_count);
strcat( out_msg, msg );
fpcount = fopen("count.txt","w");
if (fpcount!=NULL){
fprintf(fpcount,"%s", out_msg );
fclose(fpcount);
}
}
void saacproto_GS_ACK_PLAYER_COUNT_recv( int fd, int playcount )
{
online_player[fd].playcount = playcount;
}
#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
}
#ifdef _FAMILYBANKSTONELOG
void saacproto_ACgetFMBankgold_recv(int fd, char *fmname, int fmindex,
int index, int charindex, int charfdid)
{
int r = 0;
r = ACgetFMBankgold(index, fmname, fmindex, charindex);
saacproto_ACgetFMBankgold_send(fd,charfdid,r);
}
#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<MAXCONNECTION; i++){
if( gs[i].use && gs[i].name[0] )
saacproto_ACFMPointList_send( i, SUCCESSFUL, data);
}
}
}
break;
case 3: //fmpk_list
{
int j=0;
log( "reload FMPK_LIST !\n" );
FMPK_InitList();
FMPK_LoadList();
for( j=0; j<FMPKLIST_MAXNUM; j++){
for (i=0; i<MAXCONNECTION; i++){
if( gs[i].use && gs[i].name[0] )
saacproto_ACLoadFmPk_send(i, FMPK_GetData( j) );
}
}
}
break;
}
}
#ifdef _AC_SEND_FM_PK // WON ADD 庄园对战列表储存在AC
#ifdef _ACFMPK_LIST
void saacproto_ACLoadFmPk_recv(int fd, int fmpks_pos)
{
if( fmpks_pos < 0 || fmpks_pos > 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<MAXCONNECTION; i++){
if( gs[i].use && gs[i].name[0] ){
saacproto_ACLoadFmPk_send(i, FMPK_GetData( fmpks_pos-1) );
}
}
//送确认讯息
if(userindex != -1) saacproto_ACSendFmPk_send( fd, userindex, 1);
}
#else
void saacproto_ACLoadFmPk_recv(int fd, int fmpks_pos)
{
extern char fm_pk_list[9][255];
if(fmpks_pos > 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<MAXCONNECTION; i++){
if (gs[i].use && gs[i].name[0] && i!=fd){
saacproto_ACLoadFmPk_send(i, fm_pk_list[fmpks_pos-1]);
}
}
save_fm_pk_list();
}
#endif
#endif
#ifdef _RECAL_BACKUP_PLAYER // WON 回溯功能
#define arraysizeof( x ) (sizeof(x)/sizeof(x[0]))
void saacproto_ACRecalPlayer_recv(int fd, char *uid, int userfdid, int GmCliId,
char *id, int char_num, int date, int backup_flag)
{
if( strlen(id) < 1 ) { log("\n id(%s) too shout !!", id); return; }
if( char_num<0 || char_num>1) { log("\n char_num(%d) err !!", char_num); return; }
if( date<20000000 ) { log("\n date(%d) format err!!", date); return; }
if( backup_flag == 1 ){ // 备份日期
// 回传有备份的日期
get_backup_date(fd, uid, userfdid, GmCliId, id, char_num, date);
}else if( backup_flag == 2 ){ // 人物资料
get_online_player_data(fd, uid, userfdid, GmCliId, id, char_num, date); // 传回线上人物资料
get_backup_player_data(fd, uid, userfdid, GmCliId, id, char_num, date); // 传回备份人物资料
}
}
void saacproto_ACRecalBackup_recv(int fd, char *uid, int userfdid, int GmCliId, char *id,
int char_num, int date, char *char_data, int backup_flag)
{
extern struct ITEM_PET_CHANG item_pet_chang;
char temp[64];
int i, count=0;
char filename1[128], filename2[128];
char body[256];
if(backup_flag == 1){ // 回溯人物
// 线上人物
sprintf(filename1, "~/saac/char/0x%x/%s.%d.char", (getHash(id)&0xff), id, char_num );
// 备份人物
sprintf(filename2, "%s/char/0x%x/%s.%d.char", BACKUP_DIR, (getHash(id)&0xff), id, char_num );
// 移动备份人物至线上人物
strcpy(body, "");
sprintf(body, "mv %s %s", filename2, filename1);
system(body);
/* 回溯成功 */
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 4);
}else if(backup_flag == 2 ){ // 部分回溯人物
log("\n won test 44 ==> char_data_chang(%s)", char_data);
// 取出需回溯项目
for(i=0;i<5;i++){
memset(temp, 0, sizeof(temp));
easyGetTokenFromString( char_data , count , temp , sizeof( temp ));
item_pet_chang.equit_item[i] = atoi(temp); count++;
}
for(i=0;i<15;i++){
memset(temp, 0, sizeof(temp));
easyGetTokenFromString( char_data , count , temp , sizeof( temp ));
item_pet_chang.have_item[i] = atoi(temp); count++;
}
for(i=0;i<30;i++){
memset(temp, 0, sizeof(temp));
easyGetTokenFromString( char_data , count , temp , sizeof( temp ));
item_pet_chang.pool_item[i] = atoi(temp); count++;
}
for(i=0;i<5;i++){
memset(temp, 0, sizeof(temp));
easyGetTokenFromString( char_data , count , temp , sizeof( temp ));
item_pet_chang.have_pet[i] = atoi(temp); count++;
}
for(i=0;i<20;i++){
memset(temp, 0, sizeof(temp));
easyGetTokenFromString( char_data , count , temp , sizeof( temp ));
item_pet_chang.pool_pet[i] = atoi(temp); count++;
}
// 处理部分回溯功能
recal_part_backup(fd, uid, userfdid, GmCliId, id, char_num, date);
}
}
void recal_part_backup(int fd, char *uid, int userfdid, int GmCliId, char *id, int char_num, int date)
{
/*
extern struct ITEM_PET_CHANG item_pet_chang;
FILE *fp;
char filename[128], filename2[128], body[128];
char onlin_char[65500], backup_char[65500];
char *c_ptr, c_temp;
int i=0;
char *temp=NULL, *temp2, *temp3, *temp4, *temp5, *msg1, delim[20], out_msg[65530];
// 线上人物
{
c_ptr=onlin_char;
snprintf(body , sizeof(body ) , "%s.%d.char" , id , char_num );
makeDirFilename(filename , sizeof(filename), chardir , getHash(id) ,body);
if( !(fp=fopen(filename, "r")) ){
log("\n open (%s) file err", filename ); return;
}
memset(onlin_char, 0, sizeof(onlin_char));
do{
c_temp = fgetc(fp);
*c_ptr=c_temp;
c_ptr++;
}while(c_temp != EOF);
*c_ptr='\0';
fclose(fp);
}
// 备份人物
{
c_ptr=backup_char;
snprintf(body , sizeof(body ) , "%s.%d.char" , id , char_num );
makeDirFilename(filename , sizeof(filename), chardir , getHash(id) ,body);
sprintf(filename2, "%s/%s", BACKUP_DIR, filename);
if( !(fp=fopen( filename2, "r" )) ){
log("\n won test 100 ==> open (%s) file err", filename ); return;
}
memset(backup_char, 0, sizeof(backup_char));
do{
c_temp = fgetc(fp);
*c_ptr=c_temp;
c_ptr++;
}while(c_temp != EOF);
*c_ptr='\0';
fclose(fp);
}
log("\n won test 1 ==>");
{
for(i=0;i<5;i++){
if( item_pet_chang.equit_item[i] != i ){
log("\n won test 2 ==> i(%d) item(%d)", i, item_pet_chang.equit_item[i]);
// 线上人物
while( temp==NULL ){
log("\n won test 2.1 ==> temp(%s)", temp);
sprintf( delim, "item%d=", i);
log("\n won test 2.2 ==> delim(%s)", delim);
temp=strstr( onlin_char, delim);
log("\n won test 2.3 ==> temp(%s)", temp);
if((i==0)&&(temp==NULL)){
sprintf( delim, "flg2=");
temp=strstr( onlin_char, delim);
log("\n won test 2.4 ==> temp(%s)", temp);
break;
}
i--;
}
log("\n won test 3 ==> temp(%s)", temp);
temp2=strstr( temp, "\n");
log("\n won test 3.1 ==> temp2(%s)", temp2);
msg1=(char*)calloc( 1,sizeof(char)*strlen(onlin_char)-strlen(temp2)+1);
snprintf(msg1, strlen(onlin_char)-strlen(temp2), "%s", onlin_char );
log("\n won test 3.2 ==> msg1(%s)", msg1);
// 备份人物
sprintf( delim, "item%d=", item_pet_chang.equit_item[i]-5+1);
temp3=strstr( backup_char, delim);
temp4=strstr( temp3, "\n");
temp5=(char*)calloc( 1,sizeof(char)*strlen(temp3)-strlen(temp4)+1);
snprintf(temp5, strlen(temp3)-strlen(temp4), "%s", temp3);
log("\n won test 4 ==> temp5(%s)", temp5);
// 组合
memset(out_msg, 0, sizeof(out_msg));
strcpy(out_msg, msg1);
strcat(out_msg, temp5); // 回溯的部分
strcat(out_msg, temp2);
log("\n won test 5 ==> out_msg(%s)", out_msg);
}
}
}
*/
}
#endif
#ifdef _CHECKFMSCHEDULE // Syu ADD 透过AC确认家族挑战排程
void saacproto_ACCheckSchedule_recv(int fd,char *data)
{
extern gmsv gs[MAXCONNECTION];
int i,j;
char filename[256];
char token[256];
char line[64];
char line1[64];
char line2[64];
FILE* fpm;
easyGetTokenFromBuf(data, '|', 2, line1, sizeof(line1));
j = atoi(data);
snprintf( filename ,sizeof( filename ) ,"%s/%d.%s" ,
"family",j,"fmschedule.txt");
if( !(fpm=fopen( filename , "r")) )
{
log("\nSyu log open file error!!");
sprintf(line2,"%d %s",j,"FALSE");
for (i=0; i<MAXCONNECTION; i++)
if (gs[i].use && gs[i].name[0])
saacproto_ACCheckSchedule_send(i,line2);
}
else
{
fgets( token , sizeof(token) , fpm );
easyGetTokenFromBuf(token, '|', 2, line, sizeof(line));
log("\nSyu test line -> %s , %s",line,line1);
if ( atoi(line1) > atoi(line) )
{
sprintf(line2,"%d %s",j,"TRUE");
for (i=0; i<MAXCONNECTION; i++)
if (gs[i].use && gs[i].name[0])
saacproto_ACCheckSchedule_send(i,line2);
}
else
{
sprintf(line2,"%d %s",j,"FALSE");
for (i=0; i<MAXCONNECTION; i++)
if (gs[i].use && gs[i].name[0])
saacproto_ACCheckSchedule_send(i,line2);
}
}
}
#endif
void saacproto_ACManorPKAck_recv(int fd, char *data)
{
#ifdef __FAMILY
#ifdef _AC_SEND_FM_PK // WON ADD 庄园对战列表储存在AC
// 不处理
#else
extern gmsv gs[MAXCONNECTION];
int i;
for (i=0; i<MAXCONNECTION; i++)
{
if (gs[i].use && gs[i].name[0])
{
saacproto_ACManorPKAck_send(i, data);
}
}
#endif
#endif
}
#ifdef _AUCTIONEER
void saacproto_ACAuctionSold_recv(int fd, char *data)
{
AuctionSold(data);
}
#endif
#ifdef _WAEI_KICK
void saacproto_ACKick_recv( int ti ,char* id, int lock,int mesgid )
{
if( ti != -1 ) {
if( !is_game_server_login(ti) ){ //MAXCONNECTION
saacproto_ACKick_send( ti , 0 , "not login" , mesgid );
return;
}
}
sprintf(retdata, "ACTION !!");
//"LSLOCK","KICK","DEUNLOCK","UNLOCKALL","LOCK","TYPE", "UNLOCK"
switch( lock) {
case 0://LSLOCK
#ifdef _LOCK_SERVER
LServer_SAUNLock_send( ti, id, mesgid, 0);
#endif
break;
case 1: //跨星球踢人 KICK
{
int i;
for(i=0;i<MAXCONNECTION;i++) {
if( is_game_server_login(i) ){
saacproto_ACKick_send( i , 1 , id , mesgid );
}
}
}
break;
case 2: //DEUNLOCK
break;
case 3: //UNLOCKALL
{
extern gmsv gs[MAXCONNECTION];
DeleteMemLockServer( gs[ti].name);
sprintf(retdata, "GM UNLOCK ALL");
}
break;
case 4: //LOCK
#ifdef _LOCK_ADD_NAME
if ( lockUser( getGSName( ti ) , id , "" , "0" , lock , result,sizeof(result),
retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
#else
if ( lockUser( getGSName( ti ) , id , "0" , lock , result,sizeof(result),
retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
#endif
sprintf(retdata, "LOCK USER !!");
}
break;
case 5: //查询玩家状态 TYPE
{
char buf[4096];
if (GetMemLockState(getHash(id) & 0xff, id, buf)) {
sprintf(retdata, "USR LOCKED: %s", buf);
} else {
sprintf(retdata, "USR UNLOCKED: %s", buf);
}
}
break;
case 6: //MEMORY UNLOCK; UNLOCK
{
char result[100], retdata[100], process[16];
int ret = 0;
#ifdef _LOCK_ADD_NAME
ret = lockUser( getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) ,
retdata , sizeof( retdata ) , "0" , "0");
#else
ret = lockUser( getGSName(ti), id , "0" , 0 , result , sizeof( result ) ,
retdata , sizeof( retdata ) , "0" , "0");
#endif
if( strcmp( result , SUCCESSFUL ) == 0 ){
log( "UCHECK: unlock %s OK\n" , id );
} else {
log( "UCHECK: unlock %s FAILED\n" , id );
return;
}
snprintf( process , sizeof(process) , "%d" , ret );
#ifdef _UNLOCKPOOL
if( addUnlockPool( ti, id, "", process, mesgid) <0 ) {
#else
if( addWorkerTask( id , "dummy" , "3" , dummyCallback , ti ,
id , "dummy" , charname , process ,"", mesgid , 0 ) < 0 ) {
#endif
log("Game end error, process=%s\n" , process );
}else {
log("Game end :process=%s\n" , process );
}
}
break;
#ifdef _FIX_MESSAGE
case 7:
{
char buf[4096];
int i;
if (GetMemLockState(getHash(id) & 0xff, id, buf)) {
log("\n won test 20.1 ==>");
// 有lock的话踢人
for(i=0;i<MAXCONNECTION;i++) {
if( is_game_server_login(i) ){
saacproto_ACKick_send( i , 1 , id , mesgid );
}
}
} else { // 没有lock的话送 game end
char result[100], retdata[100], process[16];
int ret = 0;
log("\n won test 20.2 ==>");
#ifdef _LOCK_ADD_NAME
ret = lockUser( getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) ,
retdata , sizeof( retdata ) , "0" , "0");
#else
ret = lockUser( getGSName(ti), id , "0" , 0 , result , sizeof( result ) ,
retdata , sizeof( retdata ) , "0" , "0");
#endif
snprintf( process , sizeof(process) , "%d" , ret );
#ifdef _UNLOCKPOOL
if( addUnlockPool( ti, id, "", process, mesgid) <0 ) {
#else
if( addWorkerTask( id , "dummy" , "3" , dummyCallback , ti ,
id , "dummy" , charname , process ,"", mesgid , 0 ) < 0 ) {
#endif
log("Game end error, process=%s\n" , process );
}else {
log("Game end :process=%s\n" , process );
}
}
}
break;
#endif
case 10: //跨星球踢人不含load该星球
{
int i;
for(i=0;i<MAXCONNECTION;i++) {
if( is_game_server_login(i) && i != ti ){
saacproto_ACKick_send( i , 1 , id , mesgid );
}
}
}
break;
}
saacproto_ACKick_send( ti, 0, retdata, mesgid );
}
#endif
#ifdef _WORKER_AUTO_LOGOUT // WON ADD GS断线自动送LOGOUT给WORKER
void Worker_send_logout( int ti ,char* id )
{
char result[100], retdata[100], process[16];
int ret = 0;
#ifdef _LOCK_ADD_NAME
ret = lockUser( getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) ,
retdata , sizeof( retdata ) , "0" , "0");
#else
ret = lockUser( getGSName(ti), id , "0" , 0 , result , sizeof( result ) ,
retdata , sizeof( retdata ) , "0" , "0");
#endif
snprintf( process , sizeof(process) , "%d" , ret );
#ifdef _UNLOCKPOOL
if( addUnlockPool( ti, id, "", process, -1) <0 ) {
#else
if( addWorkerTask( id , "dummy" , "3" , dummyCallback , ti ,
id , "dummy" , charname , process ,"", -1 , 0 ) < 0 ) {
#endif
log("\n Game end error, process(%s)\n" , process );
}else {
log("\n Game end :process(%s)\n" , process );
}
}
#endif
#ifdef _NEW_PLAYERGOLD
void saacproto_ACNewPlayerList_recv( int fd, char *CdKey, char *UserName, int UserIndex, int RunType)
{
int ret=-1;
switch( RunType){
case 1: //Del
ret = DelNEWPlayerfromFile( CdKey, UserName, RunType);
break;
case 2: //Add
ret = AddNEWPlayertoFile( CdKey, UserName, strlen( CdKey));
break;
}
saacproto_ACNewPlayerList_send( fd, CdKey, UserName, UserIndex, ret);
}
#endif
#ifdef _DEFEND_NEWUSERS
void saacproto_DefendList_recv( int fd, int type, char *data)
{
switch( type){
case 1:
DEFEND_LoadUserForList( data);
break;
case 2:
DEFEND_LoadScoreForList( data);
break;
case 3: //检查积分
break;
case 4: //删除积分纪录
break;
}
}
void saacproto_CheckDefendScore_recv( int fd, int userindex, char *cdkey, char *name)
{
if( userindex == -1 ) return;
if( cdkey == NULL ) return;
if( name == NULL ) return;
DEFEND_CheckScoreForList( fd, userindex, cdkey, name);
}
#endif
#ifdef _PAUCTION_MAN
void saacproto_ACItemAuction_recv( int fd, char *ITEMNAME, char *data, int itemID, int ret, int flg)
{
log( "ACItemAuction( %d, %s, %s, %d, %d, %d)\n", fd, ITEMNAME, data, itemID, ret, flg);
IAData_ITEM( fd, itemID, ITEMNAME, data, ret, flg);
}
#endif
#ifdef _FIX_WORKS
void saacproto_WORKLogin_recv( int fd , char* workname, char* workpass, int work_port )
{
}
#endif
#ifdef _NEW_PLAYERGOLD
void saacproto_LoadNEWPlayer_recv( int ti , int charaindex, char* filename)
{
char Token[256];
if( LoadNEWPlayerListAdd( filename) <= 0 ){
sprintf( Token, "重读新手名单-错误。");
}else{
sprintf( Token, "重读新手名单-完成。");
}
saacproto_LoadNEWPlayer_send( ti, charaindex, Token);
}
#endif
#ifdef _DEATH_CONTEND
void saacproto_PKLISTGETDATA_recv( int fd, int start, int count)
{
log( "PKLISTGETDATA_recv( %d, %d) \n", start, count);
PKLIST_GetPkTeamListData( fd, start, count );
}
void saacproto_PKLISTGETDATA_send( int fd, char *ret, int endti, char *data)
{
saacproto_CreateHeader( saacproto.work , "PKLISTGETDATA" );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_int( endti ) ,saacproto.workbufsize );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_string( data ) ,saacproto.workbufsize );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_string( ret ) ,saacproto.workbufsize );
saacproto_Send( fd , saacproto.work );
}
void saacproto_PKLISTUPDATE_recv( int fd, int menum, char *mecdkey, int tonum, char *tocdkey, int winer, int flg)
{
PKLIST_UpdatePkTeamList( fd, menum, mecdkey, tonum, tocdkey, winer, flg);
}
void saacproto_PKLISTCHARTS_recv( int fd, int type, int flg)
{
//andy_log
log( "PKLISTCHARTS_recv( %d, %d)\n", type, flg);
PKLIST_TheCharts( fd, type, flg);
}
void saacproto_PKLISTCHARTS_send( int fd, char *data, int type, int flg )
{
saacproto_CreateHeader( saacproto.work , "PKLISTCHARTS" );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_string( data ) ,saacproto.workbufsize );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_int( type ) ,saacproto.workbufsize );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_int( flg ) ,saacproto.workbufsize );
saacproto_Send( fd , saacproto.work );
}
/*
void saacproto_PKLISTUPDATE_send( int fd, char *ret, int mesgid, int charindex, char *data)
{
saacproto_CreateHeader( saacproto.work , "PKLISTUPDATE" );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_int( mesgid ) ,saacproto.workbufsize );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_int( charindex ) ,saacproto.workbufsize );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_string( ret ) ,saacproto.workbufsize );
saacproto_strcatsafe( saacproto.work , saacproto_mkstr_string( data ) ,saacproto.workbufsize );
saacproto_Send( fd , saacproto.work );
}
*/
#endif
#ifdef _GM_BROADCAST // WON ADD 客服公告系统
void broadcast( char *msg )
{
extern gmsv gs[MAXCONNECTION];
int time = 0, loop = 0, wait = 0, i = 0;
char post_msg[10*80] = {0};
strtok( msg, " " );
time = atoi( strtok( NULL, " " ) );
loop = atoi( strtok( NULL, " " ) );
wait = atoi( strtok( NULL, " " ) );
for( i=0; i<10; i++ ){
char *temp;
temp=strtok( NULL, " " );
if( temp ){
strcat( post_msg, temp );
strcat( post_msg, " " );
}
}
post_msg[ strlen( post_msg ) - 1 ] = 0;
log("\n won test 2 ==> time(%d) loop(%d) wait(%d) \n post_msg(%s)", time, loop, wait, post_msg );
for(i=0; i<MAXCONNECTION; i++){
if(gs[i].use && gs[i].name[0]){
log("\n won test 2.1 ==> i(%d)", i );
saacproto_GmBroadcast_send(i, time, loop, wait, post_msg );
}
}
}
#endif
#ifdef _SEND_EFFECT // WON ADD 送下雪、下雨等特效
void SendEffect(char *effect)
{
extern gmsv gs[MAXCONNECTION];
int i;
for (i=0; i<MAXCONNECTION; i++) {
if (gs[i].use && gs[i].name[0]) {
saacproto_SendEffect_send(i, effect);
}
}
}
#endif
#ifdef _BAD_PLAYER // WON ADD 送坏玩家去关
void BadPlayer(void)
{
int i;
extern char BadPlayerList[500][20]; // 定义最大 500 名
char *filename={"sendjail.txt"};
FILE *fp;
extern int MAX_BAD_PLAYER;
memset( BadPlayerList, 0, sizeof(BadPlayerList));
if( !(fp=fopen(filename, "r")) ){
log("\n read sendjail.txt FAIL !!");
return;
}
for( i=0; i<500; i++){
char buf[256];
if( fscanf( fp, "%s", buf) == EOF ) break;
buf[strlen(buf)+1] = 0;
memcpy( BadPlayerList[i], buf, strlen(buf)+1);
}
fclose( fp);
// WON TEST
for( i=0; i<500; i++){
if( strcmp( BadPlayerList[i], "" ) ==0 ){
MAX_BAD_PLAYER = i;
break;
}
}
}
#endif
#ifdef _AC_SEND_FM_PK // WON ADD 庄园对战列表储存在AC
void load_fm_pk_list()
{
int i;
extern char fm_pk_list[9][255];
char *filename={"family/fm_pk_list.txt"};
FILE *fp;
if( !(fp=fopen(filename, "r")) ){
return;
}
for( i=0; i<9; i++){
char buf[256];
if( fscanf( fp, "%s", buf) == EOF ) break;
buf[strlen(buf)+1] = 0;
memcpy( fm_pk_list[i], buf, strlen(buf)+1);
}
fclose( fp);
log("\n");
}
void save_fm_pk_list()
{
int i;
extern char fm_pk_list[9][255];
char *filename={"family/fm_pk_list.txt"};
FILE *fp;
if( !(fp=fopen(filename, "w")) ){
return;
}
for( i=0; i<9; i++){
fprintf(fp, "%s\n", fm_pk_list[i]);
}
fclose( fp);
}
#endif
#ifdef _CHAR_POOLITEM
void saacproto_ACCharInsertPoolItem_recv( int fd, char *cdkey, int userindex, int clifdid, char *Pooldataarg)
{
if( !is_game_server_login( fd) ){
return;
}
if( InsertCharPoolItem( cdkey, Pooldataarg, strlen(Pooldataarg)) <= 0 ) {
log("\n InsertPoolItem( %s) err!!\n", cdkey);
saacproto_ACCharSavePoolItem_send( fd , FAILED , Pooldataarg, clifdid );
}
}
void saacproto_ACCharSavePoolItem_recv( int fd, char *cdkey, int userindex, int clifdid, char *Pooldataarg)
{
if( !is_game_server_login( fd) ){
return;
}
if( saveCharPoolItem( cdkey, Pooldataarg, strlen(Pooldataarg)) < 0 ) {
saacproto_ACCharSavePoolItem_send( fd , FAILED , Pooldataarg, clifdid );
}
}
void saacproto_ACCharGetPoolItem_recv( int fd, char *cdkey, int userindex, int clifdid, int npcid)
{
char loadbuf[CHARDATASIZE];
int ret=-1;
if( !is_game_server_login( fd) ){
return;
}
ret = loadCharPoolItemOne( cdkey , loadbuf , sizeof(loadbuf));
if( ret == -1 ){//找不到档案
saacproto_ACCharGetPoolItem_send( fd , FAILED, loadbuf, clifdid, npcid);
return;
}
saacproto_ACCharGetPoolItem_send( fd , SUCCESSFUL, loadbuf, clifdid, npcid);
}
#endif
#ifdef _CHAR_POOLPET
void saacproto_ACCharInsertPoolPet_recv( int fd, char *cdkey, int userindex, int clifdid, char *Pooldataarg)
{
if( !is_game_server_login( fd) ){
return;
}
if( InsertCharPoolPet( cdkey, Pooldataarg, strlen(Pooldataarg)) <= 0 ) {
log("\n InsertPoolPet( %s) err!!\n", cdkey);
saacproto_ACCharSavePoolPet_send( fd , FAILED , Pooldataarg, clifdid );
}
}
void saacproto_ACCharSavePoolPet_recv( int fd, char *cdkey, int userindex, int clifdid, char *Pooldataarg)
{
if( !is_game_server_login( fd) ){
return;
}
if( saveCharPoolPet( cdkey, Pooldataarg, strlen(Pooldataarg)) < 0 ) {
saacproto_ACCharSavePoolPet_send( fd , FAILED , Pooldataarg, clifdid );
}
}
void saacproto_ACCharGetPoolPet_recv( int fd, char *cdkey, int userindex, int clifdid, int npcid)
{
char loadbuf[CHARDATASIZE];
int ret=-1;
if( !is_game_server_login( fd) ){
return;
}
ret = loadCharPoolPetOne( cdkey , loadbuf , sizeof(loadbuf));
if( ret == -1 ){//找不到档案
saacproto_ACCharGetPoolPet_send( fd , FAILED, loadbuf, clifdid, npcid);
return;
}
saacproto_ACCharGetPoolPet_send( fd , SUCCESSFUL, loadbuf, clifdid, npcid);
}
#endif
#ifdef _UNIVERSE_CHATROOM
void saacproto_ACUniChatroom_recv( int fd, char *cdkey, char *data, int userindex, int clifdid )
{
CHATROOM_RecvAll( fd, cdkey, data, userindex, clifdid );
}
#endif
#ifdef _RECAL_BACKUP_PLAYER // WON 回溯功能
// 取有备份的日期
void get_backup_date(int fd, char *uid, int userfdid, int GmCliId, char *id, int char_num, int date)
{
int filenum=-1, i;
STRING64 filenames[256*30];
char char_data[65500];
char id_dir[20];
filenum = rgetFileName( BACKUP_DIR, filenames, arraysizeof(filenames) );
if( filenum == -1 ){
log("\n get_backup_date ==> filenum err !!");
return;
}
sprintf(id_dir, "%x", (getHash(id) & 0xff) );
memset(char_data, 0, sizeof(char_data));
// 找出符合帐号的备份日期
for( i = 0 ; i < filenum ; i ++ ){
if(strcmp(filenames[i].string, "") != 0 ){
char temp[64];
get_delim(filenames[i].string, temp, "_0x", ".tar" );
if(strcmp(temp, id_dir)==0){
char temp2[20];
get_delim(filenames[i].string, temp, "AC_", "_0x" );
snprintf(temp2, 11, "%s", temp);
strcat( char_data, temp2);
strcat( char_data, "|");
}
}
}
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 1);
}
// 取得线上人物资料
void get_online_player_data(int fd, char *uid, int userfdid, int GmCliId, char *id, int char_num, int date)
{
FILE *fp;
char filename[128];
char body[128];
char char_data[65500];
char *c_ptr, c_temp;
c_ptr=char_data;
snprintf(body , sizeof(body ) , "%s.%d.char" , id , char_num );
makeDirFilename(filename , sizeof(filename), chardir , getHash(id) ,body);
if( !(fp=fopen(filename, "r")) ){
log("\n open (%s) file err", filename );
strcpy(char_data, "无此帐号人物资料");
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 2);
return;
}
strcpy(char_data, "");
do{
c_temp = fgetc(fp);
*c_ptr=c_temp;
c_ptr++;
}while(c_temp != EOF);
*c_ptr='\0';
fclose(fp);
if( char_data[0]=='|' && char_data[1]=='|' ){
log("\n open (%s) file err", filename );
strcpy(char_data, "此帐号人物资料异常");
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 2);
return;
}
// 分析人物资料,取出所需的人物资料
analysis_char(char_data);
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 2);
}
void send_backup_player_data()
{
FILE *fp;
char filename[128];
char char_data[65500];
char *c_ptr, c_temp;
int fd=-1, userfdid=-1, GmCliId=-1, char_num=-1, date=-1, i, j, count;
char uid[64], id[64], temp[8][64], buf[255];
sprintf( filename, "%s", "backup_player_name2.txt");
if( !(fp=fopen(filename, "r")) ){
log("\n open backup_player_name2.txt err!!");
return;
}
strcpy(buf, "");
while(1)
if( fscanf( fp, "%s", buf) == EOF ) break;
fclose(fp);
for(i=0; i<8; i++) memset(temp[i], 0, sizeof(temp[i]) );
i=0; j=0; count=0;
for( i=0; i<strlen(buf)+1; i++ ){
if( buf[i] == '|' ){
j++; count=0;
continue;
}
temp[j][count] = buf[i];
count++;
}
strcpy(filename, temp[0]);
fd=atoi(temp[1]);
strcpy(uid, temp[2]);
userfdid=atoi(temp[3]);
GmCliId=atoi(temp[4]);
strcpy(id, temp[5]);
char_num=atoi(temp[6]);
date=atoi(temp[7]);
if( (strcmp(uid,"")==0)||(userfdid==-1)||(GmCliId==-1)||(strcmp(id,"")==0)||(char_num==-1)||(date==-1) ) {
strcpy(char_data, "无此帐号人物资料1");
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 3);
return;
}
sprintf( filename, "%s%s.%d.char", temp[0], id, char_num );
if( !(fp=fopen(filename, "r")) ){
log("\n open (%s) file err", filename );
strcpy(char_data, "无此帐号人物资料2");
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 3);
return;
}
c_ptr=char_data;
strcpy(char_data, "");
do{
c_temp = fgetc(fp);
*c_ptr=c_temp;
c_ptr++;
}while(c_temp != EOF);
*c_ptr='\0';
fclose(fp);
if( char_data[0]=='|' && char_data[1]=='|' ){
log("\n open (%s) file err", filename );
strcpy(char_data, "此帐号人物资料异常");
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 3);
return;
}
analysis_char(char_data);
saacproto_ACRecalPlayer_send(fd, uid, userfdid, GmCliId, id, char_num, date, char_data, 3);
}
void get_backup_player_data(int fd, char *uid, int userfdid, int GmCliId, char *id, int char_num, int date)
{
char filename[128];
char body[255];
sprintf(filename, "AC_%d*_0x%x.tar.gz", date, (getHash(id)&0xff) );
strcpy(body, "");
sprintf(body, "echo \"%s|%d|%s|%d|%d|%s|%d|%d|0x%x\" > backup_player_name.txt; ~/saac/recal_player.sh",
filename, fd, uid, userfdid, GmCliId, id, char_num, date, (getHash(id)&0xff) );
system(body);
}
void analysis_char(char *char_data)
{
int i;
char delime[64];
extern struct PLAYER_DATA player_data;
char_data_count=0;
// player name
memset( player_data.name, 0, sizeof(player_data.name) );
won_get(player_data.name, "", "|");
// player information
_won_get_player( char_data );
// have item
for(i=0; i<MAX_HAVE_ITEM; i++){
sprintf(delime, "item%d=", i);
memset( player_data.item[i], 0, sizeof(player_data.item[i]) );
memset( player_data.item_name[i], 0, sizeof(player_data.item_name[i]) );
won_get(player_data.item[i], delime, "\\z");
if((strcmp( player_data.item[i], "")) == 0) continue;
won_get(player_data.item_name[i], "na=", "\\z");
won_get(player_data.item[i], "ucode=", "\\z");
}
// pool item
for(i=MAX_HAVE_ITEM; i<MAX_HAVE_ITEM+MAX_POOL_ITEM; i++){
sprintf(delime, "poolitem%d=", i);
memset( player_data.item[i], 0, sizeof(player_data.item[i]) );
memset( player_data.item_name[i], 0, sizeof(player_data.item_name[i]) );
won_get(player_data.item[i], delime, "\\z");
if((strcmp( player_data.item[i], "")) == 0) continue;
won_get(player_data.item_name[i], "na=", "\\z");
won_get(player_data.item[i], "ucode=", "\\z");
}
// have pet
for(i=0; i<MAX_HAVE_PET; i++){
sprintf(delime, "pet%d=", i);
memset( player_data.pet[i], 0, sizeof(player_data.pet[i]) );
memset( player_data.pet_name[i], 0, sizeof(player_data.pet_name[i]) );
won_get(player_data.pet[i], delime, "\\z");
if((strcmp( player_data.pet[i], "")) == 0) continue;
won_get(player_data.pet[i], "lv:", "\\z");
won_get(player_data.pet[i], "hp:", "\\z");
won_get(player_data.pet[i], "vi:", "\\z");
won_get(player_data.pet[i], "str:", "\\z");
won_get(player_data.pet[i], "tou:", "\\z");
won_get(player_data.pet[i], "dex:", "\\z");
won_get(player_data.pet_name[i], "name:", "\\z");
won_get(player_data.pet[i], "ocd:", "\\z");
won_get(player_data.pet[i], "ocn:", "\\z");
won_get(player_data.pet[i], "ucode:", "\\z");
}
// pool pet
for(i=MAX_HAVE_PET; i<MAX_HAVE_PET+MAX_POOL_PET; i++){
sprintf(delime, "poolpet%d=", i);
memset( player_data.pet[i], 0, sizeof(player_data.pet[i]) );
memset( player_data.pet_name[i], 0, sizeof(player_data.pet_name[i]) );
won_get(player_data.pet[i], delime, "\\z");
if((strcmp( player_data.pet[i], "")) == 0) continue;
won_get(player_data.pet[i], "lv:", "\\z");
won_get(player_data.pet[i], "hp:", "\\z");
won_get(player_data.pet[i], "vi:", "\\z");
won_get(player_data.pet[i], "str:", "\\z");
won_get(player_data.pet[i], "tou:", "\\z");
won_get(player_data.pet[i], "dex:", "\\z");
won_get(player_data.pet_name[i], "name:", "\\z");
won_get(player_data.pet[i], "ocd:", "\\z");
won_get(player_data.pet[i], "ocn:", "\\z");
won_get(player_data.pet[i], "ucode:", "\\z");
}
strcpy(char_data, "");
// player name
strcpy(char_data,"名称:");
strcat(char_data, player_data.name);
// player information
strcat(char_data,"转生:");
strcat(char_data, player_data.trn);
strcat(char_data,"等级:");
strcat(char_data, player_data.lv);
strcat(char_data,"经验值:");
strcat(char_data, player_data.exp);
strcat(char_data,"HP");
strcat(char_data, player_data.hp);
strcat(char_data,"MP");
strcat(char_data, player_data.mp);
strcat(char_data,"体:");
strcat(char_data, player_data.vi);
strcat(char_data,"攻:");
strcat(char_data, player_data.str);
strcat(char_data,"防:");
strcat(char_data, player_data.tou);
strcat(char_data,"敏:");
strcat(char_data, player_data.dex);
strcat(char_data,"金钱:");
strcat(char_data, player_data.gold);
strcat(char_data,"银行存款:");
strcat(char_data, player_data.bankgld);
strcat(char_data,"伊甸个人存款:");
strcat(char_data, player_data.pgold);
strcat(char_data,"家族编号:");
strcat(char_data, player_data.fmi);
strcat(char_data,"家族名称:");
strcat(char_data, player_data.fmname);
strcat(char_data,"族长旗标:");
strcat(char_data, player_data.fmlf);
strcat(char_data,"声望:");
strcat(char_data, player_data.fame);
strcat(char_data,"图层:");
strcat(char_data, player_data.fl);
strcat(char_data,"X");
strcat(char_data, player_data.x);
strcat(char_data,"Y");
strcat(char_data, player_data.y);
strcat(char_data, "|");
for(i=0; i<MAX_HAVE_ITEM+MAX_POOL_ITEM; i++){
strcat(char_data, "item:");
strcat(char_data, player_data.item_name[i]);
strcat(char_data, player_data.item[i]);
strcat(char_data, "|");
}
for(i=0; i<MAX_HAVE_PET+MAX_POOL_PET; i++){
strcat(char_data, "pet:");
strcat(char_data, player_data.pet_name[i] );
strcat(char_data, player_data.pet[i] );
strcat(char_data, "|");
}
}
void _won_get(char *get, char *delime1, char *delime2, char *char_data)
{
char temp[1024];
memset(temp, 0, sizeof(temp));
if( get_delim( char_data+char_data_count, temp, delime1, delime2) ){
strcat(get, temp);
strcat(get, "\n");
}else{
strcat(get, "");
}
}
int get_delim(char *msg, char *temp, char *delime1, char *delime2)
{
char *out1, *out2;
int buffsize=0;
if( (out1=strstr( msg, delime1)) == NULL ) return 0;
if( (out2=strstr( out1+strlen(delime1), delime2)) == NULL ) return 0;
if( (buffsize=strlen(out1)-strlen(out2)-strlen(delime1) ) <= 0 ) return 0;
char_data_count += strlen(msg) - strlen(out2) -1;
snprintf( temp, buffsize+1, out1+strlen(delime1) );
return 1;
}
int rgetFileName( char* dirname , STRING64* string, int size)
{
int index=0;
if( rrd( dirname , string ,size ,&index ) == -1 )return -1;
else return index;
}
int rrd( char* dirname , STRING64* buf ,int bufsize, int* index)
{
DIR* d;
char dirn[1024];
d = opendir( dirname );
if( d == NULL )return -1;
while( 1 ){
struct dirent* dent;
struct stat st;
dent = readdir( d );
if( dent == NULL ){
if( errno == EBADF ){
closedir(d);
return -1;
}else
/* successful */
break;
}
if( dent->d_name[0] == '.' )continue;
snprintf(dirn, sizeof(dirn), "%s/%s" , dirname,dent->d_name );
if( stat( dirn , &st ) == -1 )continue;
if( S_ISDIR( st.st_mode ) ){
if( rrd( dirn , buf ,bufsize, index) == -1 ){
closedir(d);
return -1;
}
}else{
if( *index >= bufsize )
break;
strcpy( buf[*index].string , dirn );
(*index)++;
}
}
closedir(d);
return 1;
}
void _won_get_player(char *char_data)
{
_won_get_2( char_data, player_data.fl, "nfl=" );
_won_get_2( char_data, player_data.x, "nx=" );
_won_get_2( char_data, player_data.y, "ny=" );
_won_get_2( char_data, player_data.lv, "nlv=" );
_won_get_2( char_data, player_data.gold, "ngld=" );
_won_get_2( char_data, player_data.hp, "nhp=" );
_won_get_2( char_data, player_data.mp, "nmp=" );
_won_get_2( char_data, player_data.vi, "nvi=" );
_won_get_2( char_data, player_data.str, "nstr=" );
_won_get_2( char_data, player_data.tou, "ntou=" );
_won_get_2( char_data, player_data.dex, "ndx=" );
_won_get_2( char_data, player_data.exp, "nexp=" );
_won_get_2( char_data, player_data.trn, "ntrn=" );
_won_get_2( char_data, player_data.fmi, "nfmi=" );
_won_get_2( char_data, player_data.fmlf, "nfmlf=" );
_won_get_2( char_data, player_data.bankgld, "nbankgld=" );
_won_get_2( char_data, player_data.fame, "nfame=" );
_won_get_2( char_data, player_data.pgold, "npersonaglod=" );
_won_get_2( char_data, player_data.fmname, "nfmname=" );
}
void _won_get_2(char *char_data, char *fun, char *check)
{
memset( fun , 0, sizeof(fun) );
won_get( fun, check, "\\n");
}
#endif // end RECAL_ASK_PLAYER
#ifdef _ALLDOMAN // Syu ADD 排行榜NPC
void LOAD_herolist()
{
FILE *fdb;
int i, linenum=0;
char filename[256], token[512];
snprintf( filename , sizeof( filename ) ,"%s/%s" , "db/herolist","db_herolist.txt");
if( !( fdb = fopen ( filename , "r+" ) ) ) {
log("\nSyu log open db_herolist.txt error!!");
return ;
}else {
#ifdef _FIX_ALLDOMAN
int j;
char buf1[256];
for( i=0; i<MAX_HERO_LIST; i++) Herolist[i].use =0;
linenum = 0 ;
while( fgets( token, sizeof(token)-1, fdb) ){
if( token[0] == '\0' || token[0] == '\n' || token[0] == '#' ) continue;
token[strlen(token)-1] = 0;
for( i=0; i<3; i++) {
easyGetTokenFromBuf( token, '|', i+1,
Herolist[linenum].strings[i], sizeof( Herolist[linenum].strings[i]));
}
for( i=0; i<4; i++) {
easyGetTokenFromBuf( token, '|', i+4, buf1, sizeof( buf1));
Herolist[linenum].intdata[i] = atoi( buf1);
}
Herolist[linenum].use = 1;
linenum ++;
if( linenum >= MAX_HERO_LIST ) break;
}
fclose( fdb);
for( i=0; i<MAX_HERO_LIST; i++){
if( Herolist[i].use == 0 ) continue;
for( j=(MAX_HERO_LIST-1); j>i; j-- ){
if( Herolist[j].use == 0 ) continue;
if( !strcmp( Herolist[i].strings[0], Herolist[j].strings[0]) &&
!strcmp( Herolist[i].strings[1], Herolist[j].strings[1]) ){
Herolist[j].use = 0;
}
}
}
for( j=(MAX_HERO_LIST-1); j>0; j-- ){
if( Herolist[j].use == 0 ) continue;
if( Herolist[j-1].use == 1 ) continue;
for( i=0; i<3; i++) {
sprintf( Herolist[j-1].strings[i], "%s", Herolist[j].strings[i]);
}
for( i=0; i<4; i++) {
Herolist[j-1].intdata[i] = Herolist[j].intdata[i];
}
Herolist[j].use = 0;
Herolist[j-1].use = 1;
}
//andy_log
for( i=0; i<MAX_HERO_LIST; i++){
if( Herolist[i].use == 0 ) continue;
log( "hero[%d]:[%s,%s,%s,%d,%d,%d,%d]\n", i,
Herolist[i].strings[0],
Herolist[i].strings[1],
Herolist[i].strings[2],
Herolist[j-1].intdata[0],
Herolist[j-1].intdata[1],
Herolist[j-1].intdata[2],
Herolist[j-1].intdata[3] );
}
#else
char *addr;
fread ( &token , sizeof ( token ) , 1 , fdb ) ;
fclose ( fdb ) ;
do {
for ( i = 0 ; i < MAX_HERO_COLUMN ; i ++ ) {
easyGetTokenFromBuf( token , '|', i + 1 , Herolist[ linenum ][ i ] , sizeof( Herolist[ linenum ][ i ] ) );
}
linenum ++;
if ( (addr = strstr ( token , "\n" )) )
strcpy ( token , addr + 1 ) ;
else
break;
} while ( 1 ) ;
#endif
}
}
void SAVE_herolist (int fd)
{
int i ;
FILE *fdb;
char filename[256];
snprintf( filename , sizeof( filename ) ,"%s/%s" , "db/herolist","db_herolist.txt");
if( !( fdb = fopen ( filename , "w" ) ) ) {
log("\nSyu log open db_herolist.txt error!!");
return ;
}else {
#ifdef _FIX_ALLDOMAN
for ( i=0; i<MAX_HERO_LIST; i++) {
if( Herolist[i].use == 0 ) continue;
fprintf( fdb , "%s|%s|%s|%d|%d|%d|%d\n" ,
Herolist[i].strings[0],
Herolist[i].strings[1],
Herolist[i].strings[2],
Herolist[i].intdata[0],
Herolist[i].intdata[1],
Herolist[i].intdata[2],
Herolist[i].intdata[3] );
}
#else
char tmp[256];
for ( i = 0 ; i < MAX_HERO_LIST ; i ++ ) {
sprintf( tmp , "%s|%s|%s|%d|%d|%d|%d\n" ,
Herolist[i][0] ,
Herolist[i][1] ,
Herolist[i][2] ,
atoi (Herolist[i][3]) ,
atoi (Herolist[i][4]) ,
atoi (Herolist[i][5]) ,
atoi (Herolist[i][6]) );
fwrite(tmp, strlen(tmp), 1, fdb );
}
#endif
fclose ( fdb ) ;
}
}
void Send_A_herolist( int fd )
{
FILE *fdb;
int lens=0;
char filename[256],buf[256];
snprintf( filename , sizeof( filename ) ,"%s/%s" , "db/herolist","db_herolist.txt");
if( !( fdb = fopen ( filename , "r+" ) ) ) {
log("\n Syu log open db_herolist.txt error!!");
return ;
}else {
#ifdef _FIX_ALLDOMAN
char token[65535], buf1[512];
int i;
memset( token, 0, sizeof(token));
strcat( token, "A|,");
for( i=0; i<=MAX_HERO_LIST; i++){
if( Herolist[i].use == 0 ) continue;
if( i != 0 ) strcat( token, ",");
snprintf( buf1, sizeof(buf1)-1, "%d|%s|%s|%s|%d|%d|%d|%d|",
i,
Herolist[i].strings[0], Herolist[i].strings[1], Herolist[i].strings[2],
Herolist[i].intdata[0], Herolist[i].intdata[1],
Herolist[i].intdata[2], Herolist[i].intdata[3] );
strcat( token, buf1);
}
saacproto_UpdataStele_send( fd, token);
#else
char token[100 * 100];
memset( token, 0, sizeof(token));
memset( buf, 0, sizeof(buf));
while( fgets( buf , sizeof( buf ) , fdb )){
buf[strlen(buf)] = 0 ;
if( lens+strlen(buf) >= 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 );
#endif
}
}
#ifdef _FIX_ALLDOMAN
void Send_S_herolist( int ti )
{
int i;
char token[512];
extern gmsv gs[MAXCONNECTION];
memset( token, 0, sizeof(token));
strcat( token, "O|,");
for (i = 0 ; i < MAXCONNECTION ; i ++ ) {
if ( gs[i].use && gs[i].name[0] ) {
snprintf( token, sizeof(token)-1, "%d|%s|%s|%s|%d|%d|%d|%d|",
ti,
Herolist[ti].strings[0], Herolist[ti].strings[1], Herolist[ti].strings[2],
Herolist[ti].intdata[0], Herolist[ti].intdata[1],
Herolist[ti].intdata[2], Herolist[ti].intdata[3] );
saacproto_UpdataStele_send ( i, token);
}
}
}
#else
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
#endif
#define MAXUNlockM 50
#define delaytime (60*3)
UNLockMenus UNlockM[MAXUNlockM];
int UNlockM_Init( void)
{
int i;
for( i=0; i<MAXUNlockM; i++) {
memset( UNlockM[i].PlayerId, 0, sizeof( UNlockM[i].PlayerId));
UNlockM[i].use = 0;
UNlockM[i].time = 0;
}
return 1;
}
void reset_UNlockMPlayer( int ti)
{
memset( UNlockM[ti].PlayerId, 0, sizeof( UNlockM[ti].PlayerId));
UNlockM[ti].use = 0;
UNlockM[ti].time = 0;
}
int UNlockM_isBe( char *id)
{
int i;
for( i=0; i<MAXUNlockM; i++) {
if( UNlockM[i].use == 0 )continue;
if( !strcmp( UNlockM[i].PlayerId, id ) ) return 1;
}
return 0;
}
//andy add 2002/06/20
int UNlockM_addPlayer( char *id)
{
int i, post=-1;
for( i=0; i<MAXUNlockM; i++) {
if( UNlockM[i].use == 0 ){
post = i;
continue;
}
if( !strcmp( UNlockM[i].PlayerId, id ) ){
reset_UNlockMPlayer( i);
return -1;
}
}
if( post == -1 )return -1;
memset( UNlockM[post].PlayerId, 0, sizeof( UNlockM[post].PlayerId));
sprintf( UNlockM[post].PlayerId, "%s", id);
UNlockM[post].use = 1;
UNlockM[post].time = time(NULL)+delaytime;
return post;
}
//andy add 2002/06/20
int UNlockM_UnlockPlayer( void)
{
int i, nums=0;
static int UnlockClock = 0;
if( (++UnlockClock)<60 != 0 ) return 0;
//log(" UNlockM_UnlockPlayer ");
UnlockClock =0;
for( i=0; i<MAXUNlockM; i++) {
if( !UNlockM[i].use ) continue;
if( UNlockM[i].time >= 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;
}
#ifdef _ANGEL_SUMMON
extern int saveMissionTable( void );
//void saacproto_ACMissionTable_recv( int fd, int num, int type, char *data, int charaindex)
void saacproto_ACMissionTable_recv( int fd, int num, int type, char *data, char* angelinfo)
{
extern gmsv gs[MAXCONNECTION];
int i;
char buf[1024];
if( type == 1 ) { // ask data list
if( num == -1) { // ask all data
char alldata[MAXMISSIONTABLE*100];
alldata[0]='\0';
for( i =0; i <MAXMISSIONTABLE; i++) {
if( missiontable[i].flag == MISSION_NONE)
continue;
sprintf( buf, "%d|%s|%s|%d|%d|%d|%d ",
i,
missiontable[i].angelinfo,
missiontable[i].heroinfo,
missiontable[i].mission,
missiontable[i].flag,
missiontable[i].time,
missiontable[i].limittime );
strcat( alldata, buf);
}
saacproto_ACMissionTable_send( fd, -1, 1, alldata, "");
return;
}
/*
else { // ask one data
sprintf( buf, "%d|%s|%s|%d|%d|%d ",
num,
missiontable[num].angelinfo,
missiontable[num].heroinfo,
missiontable[num].mission,
missiontable[num].flag,
missiontable[num].time );
saacproto_ACMissionTable_send( fd, 1, 1, buf, "");
return;
}
*/
}
else if( type == 2 ) { // add data
int empty =-1;
log("\n Add_MissionTable:%s \n", data);
for( i =0; i <MAXMISSIONTABLE; i++) {
if( missiontable[i].angelinfo[0] == NULL ) {
empty = i;
break;
}
}
if( empty == -1) {
saacproto_ACMissionTable_send( fd, -1, 2, "", angelinfo);
return;
}
easyGetTokenFromBuf( data, '|', 1, buf, sizeof( buf));
strcpy( missiontable[empty].angelinfo, buf);
easyGetTokenFromBuf( data, '|', 2, buf, sizeof( buf));
strcpy( missiontable[empty].heroinfo, buf);
easyGetTokenFromBuf( data, '|', 3, buf, sizeof( buf));
missiontable[empty].mission = atoi( buf);
easyGetTokenFromBuf( data, '|', 4, buf, sizeof( buf));
missiontable[empty].flag = atoi( buf);
//easyGetTokenFromBuf( data, '|', 5, buf, sizeof( buf));
//missiontable[empty].time = atoi( buf);
missiontable[empty].time = (int)time(NULL);
missiontable[empty].limittime = 1;
saveMissionTable();
sprintf( buf, "%d|%s|%s|%d|%d|%d|%d ",
empty,
missiontable[empty].angelinfo,
missiontable[empty].heroinfo,
missiontable[empty].mission,
missiontable[empty].flag,
missiontable[empty].time,
missiontable[empty].limittime );
for( i=0; i<MAXCONNECTION; i++) {
if (gs[i].use && gs[i].name[0]) {
saacproto_ACMissionTable_send( i, 1, 1, buf, "");
}
}
saacproto_ACMissionTable_send( fd, 0, 2, "", angelinfo);
return;
}
else if( type == 3 ) { // del data
delMissionTableOnedata( num);
saveMissionTable();
return;
}
else if( type == 4 ) { // change data flag
char angelinfo[64];
int limittime;
log("\n Add_MissionTable:%s:%d \n", data, num);
if( num == MISSION_DOING ) {
easyGetTokenFromBuf( data, '|', 1, buf, sizeof( buf));
strcpy( angelinfo, buf);
easyGetTokenFromBuf( data, '|', 2, buf, sizeof( buf));
limittime = atoi( buf);
}
else {
strcpy( angelinfo, data);
}
for( i =0; i <MAXMISSIONTABLE; i++) {
if( missiontable[i].angelinfo[0] == NULL )
continue;
if( strcmp( missiontable[i].angelinfo, angelinfo)
&& strcmp( missiontable[i].heroinfo, angelinfo) )
continue;
missiontable[i].flag = num;
missiontable[i].time = time(NULL);
if( num == MISSION_DOING ) {
missiontable[i].limittime = limittime;
}
saveMissionTable();
sprintf( buf, "%d|%s|%s|%d|%d|%d|%d ",
i,
missiontable[i].angelinfo,
missiontable[i].heroinfo,
missiontable[i].mission,
missiontable[i].flag,
missiontable[i].time,
missiontable[i].limittime );
for( i=0; i<MAXCONNECTION; i++) {
if (gs[i].use && gs[i].name[0]) {
saacproto_ACMissionTable_send( i, 1, 1, buf, "");
}
}
return;
}
}
}
#endif
#ifdef _TEACHER_SYSTEM
void saacproto_ACCheckCharacterOnLine_recv( int fd, int charaindex, char *id, char *name, int flag)
{
LockNode *ln = userlock[getHash(id) & 0xff];
// 须要确认名字
if(name != NULL){
while(ln != NULL){
if(ln->use != 0){
if(strcmp(ln->cdkey,id) == 0 && strcmp(ln->name,name) == 0){
saacproto_ACCheckCharacterOnLine_send(fd,charaindex,1,ln->server,flag);
return;
}
}
ln = ln->next;
}
// 玩家不在线上
saacproto_ACCheckCharacterOnLine_send(fd,charaindex,0,"",flag);
}
// 不须要确认名字
else{
while(ln != NULL){
if(ln->use != 0){
if(strcmp(ln->cdkey,id) == 0){
saacproto_ACCheckCharacterOnLine_send(fd,charaindex,1,ln->server,flag);
return;
}
}
ln = ln->next;
}
// 玩家不在线上
saacproto_ACCheckCharacterOnLine_send(fd,charaindex,0,"",flag);
}
}
#endif
#ifdef _RACEMAN
//racetype 0:登记 9:删除 1~5:读资料 11~55:读资料
void saacproto_ACRaceRecordandSort_recv( int fd, int charaindex, char *code , char *id, char *name , int racetype, int catchcnt, int ranknum )
{
//比较目前的排行 如果可以进入排行榜则写入 并且回传目前的排行榜
FILE *fp;
char rankfile[64];
char allfile[64];
char line[512];
int i,j,findflag = 0;
char buf[64];
char data[4096]; //看server要多少笔就塞多少资料
//time_t endtime = (time_t)limittime;
//struct tm *limit;
//time( &endtime );
//limit = localtime( &endtime );
//limit->tm_year + 1900 , limit->tm_mon + 1 , limit->tm_mday );
//now->tm_hour , now->tm_min , now->tm_sec
//USERLOG( id , "ranktable W: successful\n" );
data[0]='\0';
memset( ranktable, 0, sizeof(ranktable));
sprintf( rankfile , "race/%s.txt", code );
fp = fopen( rankfile, "a+");
if( fp == NULL ){
log("create file:%s error !!\n", rankfile);
return;
}
if( fseek( fp , 0, SEEK_SET ) == -1 ){
fprintf( fp ,"Seek Error\n" );
fclose(fp);
return;
}
i = 0;
while(1)
{
if(fgets( line, sizeof( line), fp) == NULL) break;
chop(line);
easyGetTokenFromBuf( line, '|', 1, buf, sizeof( buf ));
sprintf( ranktable[i].id, "%s", buf);
easyGetTokenFromBuf( line, '|', 2, buf, sizeof( buf ));
sprintf( ranktable[i].name,"%s", buf);
easyGetTokenFromBuf( line, '|', 3, buf, sizeof( buf ));
ranktable[i].catchcnt = atoi(buf);
i++;
}
fclose(fp);
if(racetype == 0){
if(catchcnt >= 230 ){
sprintf( allfile , "race/%s_a.txt", code );
fp = fopen( allfile , "a+");
fprintf(fp,"%s|%s|%d|\n",id,name,catchcnt);
fclose(fp);
}
//处理排名
fp = fopen( rankfile, "w");
if( fp == NULL ){
log("create file:%s error !!\n", rankfile);
return;
}
for(i=0; i < DEFMAXRANK ;i++)
{
if( catchcnt > ranktable[i].catchcnt){ //只有大於才能把人家挤掉
for( j=DEFMAXRANK ; j>i+1 ; j-- )
{
strcpy(ranktable[j-1].id , ranktable[j-2].id);
strcpy(ranktable[j-1].name , ranktable[j-2].name);
ranktable[j-1].catchcnt = ranktable[j-2].catchcnt;
}
strcpy( ranktable[i].id , id);
strcpy( ranktable[i].name , name);
ranktable[i].catchcnt = catchcnt;
catchcnt = 0;
}else{
if(strcmp(id,ranktable[i].id)==0 && strcmp(name,ranktable[i].name)==0) continue;
}
if(ranktable[i].catchcnt == 0) break;
fprintf(fp,"%s|%s|%d|\n",ranktable[i].id , ranktable[i].name , ranktable[i].catchcnt);
}
fclose(fp);
}else if(racetype == 9){ //清除某笔资料
fp = fopen( rankfile, "w");
if( fp == NULL ){
log("create file:%s error !!\n", rankfile);
return;
}
for(i=0; i < DEFMAXRANK ;i++)
{
if(ranktable[i].catchcnt == 0) break;
if(strcmp(id,ranktable[i].id)==0 && strcmp(name,ranktable[i].name)==0) continue;
fprintf(fp,"%s|%s|%d|\n",ranktable[i].id , ranktable[i].name , ranktable[i].catchcnt);
}
fclose(fp);
}else{ //server要资料而已
for(i=0;i<ranknum;i++)
{
buf[0]='\0';
if(ranktable[i].catchcnt==0) break;
sprintf(buf,"%s|%s|%d|",ranktable[i].id , ranktable[i].name,ranktable[i].catchcnt);
strcat(data,buf);
}
}
//最後再送给server
saacproto_ACRaceRecordandSort_send( fd, charaindex , racetype , data );
}
void saacproto_ACRaceRecordfmdo_recv( int fd , int charaindex , int fmid , int bbi , char *unicode , char *petname )
{
FILE *fp;
char fmfile[64];
sprintf(fmfile,"race/family/%d.txt",fmid);
fp = fopen( fmfile, "a+");
if( fp ){
fprintf(fp,"%d|%s|%s|\n",bbi,petname,unicode);
fclose(fp);
}
else{
log("\nOpen %s File Error!!",fmfile);
}
}
#endif
/*
while(1)
{
if(fgets( line, sizeof( line), fp) == NULL) break;
chop(line);
easyGetTokenFromBuf( line, '|', 1, buf, sizeof( buf ));
if(strcmp(id,buf)==0){
easyGetTokenFromBuf( line, '|', 2, buf, sizeof( buf ));
if(strcmp(name,buf)==0){
easyGetTokenFromBuf( line, '|', 3 , buf, sizeof( buf ));
if( catchcnt > atoi(buf)){
findflag = 1;
break;
}
}
}
}
if( findflag == 0 ){
fprintf(fp,"%s|%s|%d|\n",id,name,catchcnt);
}
fclose(fp);
*/