recv.c
上传用户:qys8201
上传日期:2021-12-11
资源大小:978k
文件大小:46k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #define _RECV_C_
  2. #include "version.h"
  3. #include "main.h"
  4. #include "saacproto_util.h"
  5. #include "saacproto_serv.h"
  6. #include "recv.h"
  7. #include "char.h"
  8. #include "db.h"
  9. #include "mail.h"
  10. #include "lock.h"
  11. #include "util.h"
  12. #ifdef _SASQL
  13. #include "sasql.h"
  14. #endif
  15. // CoolFish: Family 2001/5/9
  16. #include "acfamily.h"
  17. #include "version.h"
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. char retdata[CHARDATASIZE];     
  21. char result[CHARDATASIZE];        
  22. // Spock +1 2000/11/1
  23. #define MAX_PROCESS 16777216
  24. #ifdef _VIP
  25. void saacproto_ACServerLogin_recv( int ti,char* servername , char* serverpas, int checkvip )
  26. {
  27.     login_game_server( ti , servername , serverpas, checkvip,
  28.              result , sizeof( result ) ,
  29.              retdata , sizeof( retdata ));
  30.     saacproto_ACServerLogin_send( ti ,result ,retdata );
  31. }
  32. #else
  33. void saacproto_ACServerLogin_recv( int ti,char* servername , char* serverpas )
  34. {
  35.     login_game_server( ti , servername , serverpas,
  36.              result , sizeof( result ) ,
  37.              retdata , sizeof( retdata ));
  38.     saacproto_ACServerLogin_send( ti ,result ,retdata );
  39. }
  40. #endif
  41. /*
  42.    必□丞扔□田□互失市它件玄扔□田□井日夫弘失它玄允月[
  43.    int fd : 覆擂socket
  44. */
  45. void  saacproto_ACServerLogout_recv( int ti  )
  46. {
  47.     logout_game_server( ti );
  48. }
  49. void saacproto_ACCharLoad_recv( int ti,char* id,char* pas,char* charname ,
  50.                                 int lock,char* opt , int mesgid)
  51. {
  52.     // Spock 2000/10/31
  53.     static int process = 0;
  54.     char buf[16];
  55.     // Spock end
  56. #ifdef _NewSave
  57.     int charindex = -1;
  58. #endif
  59.  
  60.     if( !is_game_server_login( ti ) ){
  61. #ifdef _NewSave
  62.         saacproto_ACCharLoad_send( ti , FAILED , "not login" , mesgid, charindex );
  63. #else
  64.         saacproto_ACCharLoad_send( ti , FAILED , "not login" , mesgid );
  65. #endif
  66.         return;
  67.     }
  68.     process++;
  69.     if ( process > MAX_PROCESS ) process = 1;
  70.     snprintf( buf , sizeof(buf) , "%d" , process );
  71. charLoadCallback(ti,0,id,pas,charname,buf,"",lock,mesgid);
  72.     // Spock 2000/10/31
  73.     //log( "读取档案: 附加作业 %s %s, 进程=%dn", id,pas,process );
  74.     // Spock end
  75. }
  76. /*
  77.    平乓仿忡绣
  78.    char *id : ID
  79.    char *pas : 天允歹□升
  80.    char *charname : 平乓仿  
  81.    char *opt : 左皿扑亦件  侬  [ CharList及午五卞丢乒午仄化忒允树  
  82.    char *charinfo : 白央奶伙卞忡绣允月平乓仿弁正及旦  □正旦树  [
  83.    int id : 丢永本□斥id
  84. */
  85. #ifdef _NewSave
  86. void saacproto_ACCharSave_recv( int ti, char* id,
  87.                                 char *charname,char* opt ,
  88.                                 char* charinfo , int unlock , int mesgid , int charindex )
  89. #else
  90. void saacproto_ACCharSave_recv( int ti, char* id,
  91.                                 char *charname,char* opt ,
  92.                                 char* charinfo , int unlock , int mesgid )
  93. #endif
  94. {
  95.     char process[16];
  96.     int ret;
  97.     if( !is_game_server_login(ti) ){
  98.         saacproto_ACCharSave_send( ti , FAILED , "not login" , mesgid );
  99.         return;
  100.     }
  101. #ifdef _NewSave
  102.     ret = charSave( ti, id, charname, opt, charinfo,
  103.                       unlock,mesgid, charindex );
  104. #else
  105.     ret = charSave( ti, id, charname, opt, charinfo,
  106.                       unlock,mesgid );
  107. #endif
  108.     snprintf( process , sizeof(process) , "%d" , ret );
  109. // log( "unlock:%d, process:%sn", unlock, process);
  110.     if( unlock) {
  111. dummyCallback(ti,0,id,"dummy",charname,process,"",mesgid,0);
  112.     }
  113.     log("玩家已保存保存n");
  114. }
  115. void saacproto_ACCharList_recv( int ti,char* id,char* pas , int mesgid)
  116. {
  117.     static int process=0;
  118.     char buf[10];
  119. //log(" get_charlist ");
  120.     process++;
  121.     if (process > MAX_PROCESS) process=1;
  122.     snprintf(buf, sizeof(buf), "%d", process);
  123.     if( !is_game_server_login( ti ) ){
  124.         saacproto_ACCharList_send( ti , FAILED , "not login" , mesgid );
  125.         return;
  126.     }
  127. charListCallback(ti,0,id,pas,"",buf,"0",mesgid,0);
  128.     log( "档案列表: %sn", id );
  129. }
  130. void saacproto_ACCharDelete_recv( int ti,char* id,char* pas,
  131.                                   char* charname , char *option , int mesgid)
  132. {
  133.     if( !is_game_server_login(ti) ){
  134.         saacproto_ACCharDelete_send( ti , FAILED , "not login" , mesgid );
  135.         return;
  136.     }
  137.     // Nuke
  138.     charDeleteCallback(ti,0,id,pas,charname,"0","",mesgid,0);
  139.     log( "档案删除: 附加作业 %s %sn",id , pas );
  140. }
  141. void saacproto_ACLock_recv( int ti ,char* id,int lock,int mesgid )
  142. {
  143. if( !is_game_server_login(ti) ){
  144. saacproto_ACLock_send( ti , FAILED , "not login" , mesgid );
  145. return;
  146. }
  147. // Arminius 7.25 test unlock
  148. log("ACLock recv:%dn",lock);
  149.   if (lock==2) {
  150. char buf[4096];
  151. if (GetMemLockState(getHash(id) & 0xff, id, buf)) {
  152. sprintf(retdata, "USRLOCKED:%s", buf);
  153. } else {
  154. sprintf(retdata, "USRUNLOCKED:%s", buf);
  155. }
  156. log(retdata);
  157.     } else if (lock==3) {
  158. int proc;
  159. if (DeleteMemLock(getHash(id) & 0xff, id, &proc)) {
  160. sprintf(retdata, "GMUNLOCKSUCCESS");
  161. } else {
  162. sprintf(retdata, "GMUNLOCKFAIL");
  163. }
  164. log(retdata);
  165. } else if (lock==4) {
  166. DeleteMemLockServer(id);
  167. sprintf(retdata, "GMUNLOCKALL");
  168.     } else {
  169. #ifdef _LOCK_ADD_NAME
  170. if ( lockUser( getGSName( ti ) , id , "" , "0" , lock , result,sizeof(result),
  171. retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
  172. #else
  173. if ( lockUser( getGSName( ti ) , id , "0" , lock , result,sizeof(result),
  174. retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
  175. #endif
  176. log( "锁定用户: %s 失败n" , id );
  177. } else {
  178. log( "锁定用户: %s 成功n" , id );
  179. }
  180.   }
  181.     // Spock end
  182.   saacproto_ACLock_send( ti , result , retdata , mesgid );
  183. }
  184. void saacproto_ACUCheck_recv( int ti , char *id , int status )
  185. {
  186.     if( !is_game_server_login(ti) ){
  187.         log( "服务器发现账号:%s status:%dn",
  188.              id, status );
  189.         return;
  190.     }
  191. if( status == 0 ){
  192.        log( "用户 %s 在 %s 并未锁定!n", id , getGSName( ti ) );
  193.        saacproto_ACKick_recv( ti, id, 6, -1);
  194.     } else {
  195.         log( "用户 %s 在 %s 已锁定!n", id , getGSName( ti ) );
  196. #ifdef _WAEI_KICK
  197. saacproto_ACKick_recv( ti, id, 1, -1);
  198. #endif
  199.     }
  200. }
  201. void saacproto_DBUpdateEntryString_recv( int fd,
  202.                                          char* table,
  203.                                          char* key,
  204.                                          char* value,
  205.                                          int msgid,
  206.                                          int msgid2 )
  207. {
  208.     int r;
  209.     r = dbUpdateEntryString( table, key, value );
  210. if( r != 0 ){
  211. log( "failed: DBUpdateEntryString err !!n");
  212. }
  213. /* 2003/06/26
  214.     if( r == 0 ){
  215. //        saacproto_DBUpdateEntryString_send( fd, SUCCESSFUL,table,key,
  216.                                             msgid,msgid2 );
  217.     } else {
  218. //        saacproto_DBUpdateEntryString_send( fd, FAILED,table,key,
  219.                                             msgid,msgid2 );        
  220.     }
  221. */
  222. }
  223. void saacproto_DBDeleteEntryString_recv( int fd,
  224.                                          char* table,
  225.                                          char* key,
  226.                                          int msgid,
  227.                                          int msgid2 )
  228. {
  229.     int r;
  230.     r = dbDeleteEntryString( table,key );
  231.     if( r == 0 ){
  232.         saacproto_DBDeleteEntryString_send( fd,SUCCESSFUL,table,key,
  233.                                             msgid,msgid2 );
  234.     } else {
  235.         saacproto_DBDeleteEntryString_send( fd,FAILED,table,key,
  236.                                             msgid,msgid2 );        
  237.     }
  238. }
  239. void saacproto_DBGetEntryString_recv( int fd,
  240.                                       char* table,
  241.                                       char* key,
  242.                                       int msgid,
  243.                                       int msgid2 )
  244. {
  245.     char output[16384];
  246.     int r;
  247.     r = dbGetEntryString( table, key, output, sizeof( output) );
  248.     if( r == 0 ){
  249.         saacproto_DBGetEntryString_send( fd,SUCCESSFUL,output,table,key,
  250.                                          msgid,msgid2 );
  251.     } else {
  252.         saacproto_DBGetEntryString_send( fd,FAILED,"",table,key,
  253.                                          msgid,msgid2 );        
  254.     }
  255.     
  256. }
  257. void saacproto_DBUpdateEntryInt_recv( int fd,
  258.                                    char* table,
  259.                                    char* key,
  260.                                    int value,
  261.                                    char *info,
  262.                                    int msgid,
  263.                                    int msgid2)
  264. {
  265.     if( !is_game_server_login(fd) ){
  266.         saacproto_DBUpdateEntryInt_send( fd, FAILED, "","",msgid, msgid2 );
  267.         return;
  268.     }    
  269.     if( dbUpdateEntryInt( table , key , value, info ) == 0 ){
  270.         saacproto_DBUpdateEntryInt_send(
  271.             fd , SUCCESSFUL ,table,key, msgid, msgid2 );
  272.     } else {
  273.         saacproto_DBUpdateEntryInt_send( fd , FAILED , table,key, msgid, msgid2 );        
  274.     }
  275. }
  276. #ifdef _ALLDOMAN // (不可开) Syu ADD 排行榜NPC
  277. void saacproto_UpdataStele_recv( int fd , char *cdkey , char *name , char *title ,
  278. int level , int trns , int time , int floor )
  279. {
  280. int i, min=140, minnum=-1, nameflag=-1;
  281. for ( i=0; i<MAX_HERO_LIST; i ++ ) {
  282. if( atoi( Herolist[i][6] ) <  min ) {
  283. min = atoi (Herolist[i][6]) ; 
  284. minnum=i;
  285. }
  286. if ( strcmp ( Herolist[i][0] , cdkey ) == 0 && strcmp ( Herolist[i][1] , name ) == 0 )
  287. nameflag = i ; 
  288. }
  289. if( strcmp ( cdkey , "FirstLoad") == 0 &&
  290. strcmp ( name , "LoadHerolist") == 0 &&
  291. floor == 999 )
  292. Send_A_herolist( fd );
  293. else if ( nameflag != -1 && floor > atoi(Herolist[nameflag][6]) ) {
  294. Send_S_herolist ( Herolist[nameflag][0] , Herolist[nameflag][1] , 
  295. cdkey , name , title , level , trns , floor ) ; 
  296. sprintf ( Herolist[nameflag][2] , "%s" , title ) ; 
  297. sprintf ( Herolist[nameflag][3] , "%d" , level ) ; 
  298. sprintf ( Herolist[nameflag][4] , "%d" , trns ) ; 
  299. sprintf ( Herolist[nameflag][5] , "%d" , time ) ; 
  300. sprintf ( Herolist[nameflag][6] , "%d" , floor ) ; 
  301. SAVE_herolist( fd );
  302. }else if ( nameflag == -1 && floor > min ) {
  303. Send_S_herolist ( Herolist[minnum][0] , Herolist[minnum][1] , 
  304. cdkey , name , title , level , trns , floor ) ; 
  305. sprintf ( Herolist[minnum][0] , "%s" , cdkey ) ; 
  306. sprintf ( Herolist[minnum][1] , "%s" , name  ) ; 
  307. sprintf ( Herolist[minnum][2] , "%s" , title ) ; 
  308. sprintf ( Herolist[minnum][3] , "%d" , level ) ; 
  309. sprintf ( Herolist[minnum][4] , "%d" , trns ) ; 
  310. sprintf ( Herolist[minnum][5] , "%d" , time ) ; 
  311. sprintf ( Herolist[minnum][6] , "%d" , floor ) ; 
  312. SAVE_herolist( fd );
  313. }
  314. }
  315. #endif
  316. void saacproto_DBGetEntryRank_recv( int fd,
  317.                                     char* table,
  318.                                     char* key,
  319.                                     int msgid,
  320.                                     int msgid2)
  321. {
  322.     int rk,c;
  323.     if( !is_game_server_login(fd) ){
  324.         saacproto_DBGetEntryRank_send( fd, FAILED, 0,0,"","",msgid, msgid2 );
  325.         return;
  326.     }
  327.     
  328.     dbGetEntryRank( table, key , &rk, &c );
  329.     if( rk <0 ){
  330.         saacproto_DBGetEntryRank_send(
  331.             fd, FAILED, -1, -1, table, key, msgid, msgid2 );
  332.     } else {
  333.         saacproto_DBGetEntryRank_send( fd, SUCCESSFUL,
  334.                                        rk, c, table, key, msgid, msgid2 );
  335.     }
  336. }
  337. void saacproto_DBDeleteEntryInt_recv( int fd,
  338.                                    char* table,
  339.                                    char* key,
  340.                                    int msgid,
  341.                                    int msgid2)
  342. {
  343.     if( !is_game_server_login(fd) ){
  344.         saacproto_DBDeleteEntryInt_send( fd, FAILED,"","",msgid, msgid2 );
  345.         return;
  346.     }
  347.     
  348.     if( dbDeleteEntryInt( table, key ) < 0 ){
  349.         saacproto_DBDeleteEntryInt_send(
  350.             fd, FAILED, table, key, msgid, msgid2 );
  351.     } else {
  352.         saacproto_DBDeleteEntryInt_send(
  353.             fd, SUCCESSFUL, table, key, msgid, msgid2 );
  354.     }
  355. }
  356.     
  357. void saacproto_DBGetEntryInt_recv( int fd,
  358.                                 char* table,
  359.                                 char* key,
  360.                                 int msgid,
  361.                                 int msgid2)
  362. {
  363.     int r ;
  364.     int output;
  365.     if( !is_game_server_login(fd) ){
  366.         saacproto_DBGetEntryInt_send( fd, FAILED,-1,"","",msgid, msgid2 );
  367.         return;
  368.     }
  369.     
  370.     r = dbGetEntryInt( table, key, &output );
  371.     
  372.     if( r < 0 ){
  373.         saacproto_DBGetEntryInt_send( fd,
  374.                                       FAILED, -1, table, key, msgid, msgid2);
  375.     } else {
  376.         saacproto_DBGetEntryInt_send(
  377.             fd, SUCCESSFUL, output, table, key, msgid, msgid2 );
  378.     }
  379. }
  380. void saacproto_DBGetEntryByRank_recv( int fd,
  381.                                 char* table,
  382.                                 int start, int end,
  383.                                 int msgid ,
  384.                                 int msgid2)
  385. {
  386.     char output[16384];
  387.     int r;
  388.     if( !is_game_server_login(fd) ){
  389.         saacproto_DBGetEntryByRank_send( fd, FAILED,"","",msgid, msgid2 );
  390.         return;
  391.     }
  392.     
  393.     r = dbGetEntryRankRange( table, start, end, output, sizeof( output ));
  394.     if( r < 0 ){
  395.         saacproto_DBGetEntryByRank_send(
  396.             fd, FAILED, "", table, msgid, msgid2 );
  397.     } else {
  398.         saacproto_DBGetEntryByRank_send(
  399.             fd, SUCCESSFUL, output,table, msgid, msgid2 );
  400.     }
  401. }
  402. void saacproto_DBGetEntryByCount_recv( int fd,
  403.                                        char* table,
  404.                                        int count_start,
  405.                                        int num,
  406.                                        int msgid ,
  407.                                        int msgid2)
  408. {
  409.     char output[16384];
  410.     int r;
  411.     if( !is_game_server_login(fd) ){
  412.         saacproto_DBGetEntryByCount_send(
  413.             fd, FAILED,"",table,count_start,msgid, msgid2 );
  414.         return;
  415.     }
  416.     
  417.     r = dbGetEntryCountRange( table, count_start, num, output, sizeof(output));
  418.     if( r < 0 ){
  419.         saacproto_DBGetEntryByCount_send( fd, FAILED, "", table,
  420.                                           count_start, msgid, msgid2 );
  421.     } else {
  422.         saacproto_DBGetEntryByCount_send( fd, SUCCESSFUL, output, table,
  423.                                           count_start,  msgid, msgid2 );       
  424.     }
  425. }
  426. void saacproto_Broadcast_recv( int fd, char* id, char* charname, char* message, int flag)
  427. {
  428.     if( !is_game_server_login( fd) ){
  429.         log( "Broadcast: no login. id:%s charname:%s message:%s flag:%dn",
  430.              id, charname, message , flag );
  431.         return;
  432.     }
  433.     gmsvBroadcast( fd, id, charname, message , flag );
  434. }
  435. void saacproto_Message_recv( int fd,
  436.                              char* id_from,
  437.                              char* charname_from,
  438.                              char* id_to,
  439.                              char* charname_to,
  440.                              char* message,
  441.                              int option )
  442. {
  443.     receiveMail( id_from, charname_from,
  444.                        id_to, charname_to, message, option ,0,0);
  445. }
  446. void saacproto_MessageAck_recv( int fd,
  447.                                 char* id,
  448.                                 char* charname,
  449.                                 char* result,
  450.                                 int mesgid )
  451. {
  452.     int a;
  453.     if( strcmp( result, SUCCESSFUL ) )a=0; else a =-1;
  454.     receiveMailAck( id, charname, a , mesgid );
  455. }
  456. void saacproto_MessageFlush_recv( int fd,
  457.                                   char* id,
  458.                                   char* charname )
  459. {
  460.     flushMail( fd, id , charname );
  461. }
  462. /*******************************************************
  463.  * CoolFish: Family 2001/5/18
  464.  ******************************************************/
  465. #ifdef _PERSONAL_FAME
  466. void saacproto_ACAddFM_recv( int fd, char *fmname, char *fmleadername,
  467. char *fmleaderid, int fmleaderlv, char *petname, char *petattr,
  468. char *fmrule, int fmsprite, int fmleadergrano, int fame, int charfdid)
  469. #else
  470. void saacproto_ACAddFM_recv( int fd, char *fmname, char *fmleadername,
  471. char *fmleaderid, int fmleaderlv, char *petname, char *petattr,
  472. char *fmrule, int fmsprite, int fmleadergrano, int charfdid)
  473. #endif
  474. {
  475. #ifdef _FAMILY
  476. int r = 0, index = 0;
  477. #ifdef _PERSONAL_FAME
  478. r = ACAddFM(fd, &index, fmname, fmleadername, fmleaderid, fmleaderlv,
  479.    petname, petattr, fmrule, fmsprite, fmleadergrano, fame, charfdid);
  480. #else
  481. r = ACAddFM(fd, &index, fmname, fmleadername, fmleaderid, fmleaderlv,
  482.    petname, petattr, fmrule, fmsprite, fmleadergrano, charfdid);
  483. #endif
  484. if (r < 0){
  485. saacproto_ACAddFM_send(fd, FAILED, r, index, charfdid);
  486. }else{
  487. saacproto_ACAddFM_send(fd, SUCCESSFUL, r, index, charfdid);
  488. }
  489. #endif
  490. }
  491. void saacproto_ACJoinFM_recv(int fd, char *fmname, int fmindex,
  492. #ifdef _PERSONAL_FAME // Arminius: 家族个人声望
  493. char *charname, char *charid, int charlv, int index, int fame, int charfdid)
  494. #else
  495. char *charname, char *charid, int charlv, int index, int charfdid)
  496. #endif
  497. {
  498. #ifdef _FAMILY
  499. int r = 0;
  500. #ifdef _PERSONAL_FAME // Arminius: 家族个人声望
  501. r =  ACJoinFM(fd, index, fmname, fmindex, charname, charid, charlv, fame, charfdid);
  502. #else
  503. r =  ACJoinFM(fd, index, fmname, fmindex, charname, charid, charlv, charfdid);
  504. #endif
  505. if (r < 0){
  506. saacproto_ACJoinFM_send(fd, FAILED, r, charfdid);
  507. }else{
  508. saacproto_ACJoinFM_send(fd, SUCCESSFUL, r, charfdid);
  509. }
  510. #endif
  511. }
  512. void saacproto_ACLeaveFM_recv(int fd, char *fmname, int fmindex,
  513. char *charname, char *charid, int index, int charfdid)
  514. {
  515. #ifdef _FAMILY
  516. int r = 0;
  517. r =  ACLeaveFM(index, fmname, fmindex, charname, charid);
  518. if (r < 0){
  519. saacproto_ACLeaveFM_send(fd, FAILED, r, charfdid);
  520. }else{
  521. saacproto_ACLeaveFM_send(fd, SUCCESSFUL, r, charfdid);
  522. }
  523. #endif
  524. }
  525. #ifdef _LEADERFUNCHECK
  526. void saacproto_ACDelFM_recv(int fd, char *fmname, int fmindex,
  527. int index, char *charname, char *charid, int charfdid)
  528. {
  529. int r = 0, result = 0;
  530. result = CheckLeaderQ(index, fmname, fmindex, charname, charid);
  531. if(result < 0)
  532. {
  533. saacproto_ACDelFM_send(fd, FAILED, charfdid);
  534. return;
  535. }
  536. // shan modify begin
  537. // original
  538. /*if (ChangeFMLeader(index, fmname, fmindex) < 0)    
  539. r = ACDelFM(index, fmname, fmindex); 
  540. else 
  541. r = -1;  // shan  1 -> -1
  542. if (r < 0)
  543. saacproto_ACDelFM_send(fd, FAILED, charfdid);
  544. else
  545. saacproto_ACDelFM_send(fd, SUCCESSFUL, charfdid);
  546. */   
  547. r = ACDelFM(index, fmname, fmindex); 
  548. if (r < 0)
  549. saacproto_ACDelFM_send(fd, FAILED, charfdid);
  550. else
  551. saacproto_ACDelFM_send(fd, SUCCESSFUL, charfdid);
  552. // shan end
  553. }
  554. #else
  555. void saacproto_ACDelFM_recv(int fd, char *fmname, int fmindex,
  556. int index, int charfdid)
  557. {
  558. #ifdef _FAMILY
  559. int r = 0;
  560. #ifdef _FMVER21
  561. if (ChangeFMLeader(index, fmname, fmindex) >= 0)
  562. r = ACDelFM(index, fmname, fmindex);
  563. else r = 1;
  564. #else
  565. r =  ACDelFM(index, fmname, fmindex);
  566. #endif
  567. if (r < 0){
  568. saacproto_ACDelFM_send(fd, FAILED, charfdid);
  569. }
  570. #ifdef _FMVER21
  571. else if (r == 1){
  572. }
  573. #endif
  574. else{
  575. saacproto_ACDelFM_send(fd, SUCCESSFUL, charfdid);
  576. }
  577. #endif
  578. }
  579. #endif
  580. void saacproto_ACShowFMList_recv(int fd)
  581. {
  582. #ifdef _FAMILY
  583. int r = 0;
  584. char data[150 * MAX_FAMILY];
  585. r =  ACShowFMList(data);
  586. if (r < 0){
  587. // saacproto_ACShowFMList_send(fd, FAILED, r, "Nothing");
  588. }else{
  589. saacproto_ACShowFMList_send(fd, SUCCESSFUL, r, data);
  590. }
  591. #endif
  592. }
  593. void saacproto_ACShowMemberList_recv(int fd, int index)
  594. {
  595. #ifdef _FAMILY
  596. int r = 0, fmacceptflag = 0, fmjoinnum = 0;
  597. char data[150 * MAX_MEMBERNUM];
  598. r =  ACShowFMMemberList(index, &fmacceptflag, &fmjoinnum, data);
  599. if (r < 0){
  600. // saacproto_ACShowMemberList_send(fd, FAILED, index, r,
  601. // fmacceptflag, fmjoinnum, "Nothing");
  602. }else{
  603. saacproto_ACShowMemberList_send(fd, SUCCESSFUL, index, r,
  604. fmacceptflag, fmjoinnum, data);
  605. }
  606. #endif
  607. }
  608. void saacproto_ACFMDetail_recv(int fd, char *fmname,
  609. int fmindex, int index, int charfdid)
  610. {
  611. #ifdef _FAMILY
  612. int r = 0;
  613. char data[15000];
  614. r =  ACFMDetail(index, fmname, fmindex, data);
  615. if (r < 0){
  616. // saacproto_ACFMDetail_send(fd, FAILED, "Nothing", charfdid);
  617. }else{
  618. saacproto_ACFMDetail_send(fd, SUCCESSFUL, data, charfdid);
  619. }
  620. #endif
  621. }
  622. #ifdef _FMVER21
  623. void saacproto_ACMemberJoinFM_recv(int fd, char *fmname, int fmindex,
  624. char *charname, int charindex, int index, int result, int meindex,
  625. int charfdid)
  626. #else
  627. void saacproto_ACMemberJoinFM_recv(int fd, char *fmname, int fmindex,
  628. char *charname, int charindex, int index, int result, int charfdid)
  629. #endif
  630. {
  631. int r = 0;
  632. #ifdef _FMVER21
  633.     r =  ACMemberJoinFM(index, fmname, fmindex, charname, charindex, result, meindex);
  634. #else
  635. r =  ACMemberJoinFM(index, fmname, fmindex, charname, charindex);
  636. #endif
  637. if (r < 0){
  638. saacproto_ACMemberJoinFM_send(fd, FAILED, charfdid);
  639. }else{
  640. saacproto_ACMemberJoinFM_send(fd, SUCCESSFUL, charfdid);
  641. }
  642. }
  643. #ifdef _FMVER21
  644. void saacproto_ACMemberLeaveFM_recv(int fd, char *fmname, int fmindex,
  645. char *charname, int charindex, int index, int meindex, int charfdid)
  646. #else
  647. void saacproto_ACMemberLeaveFM_recv(int fd, char *fmname, int fmindex,
  648. char *charname, int charindex, int index, int charfdid)
  649. #endif
  650. {
  651. #ifdef _FAMILY
  652. int r = 0;
  653. int flag = 1; // 主动离开家族
  654. #ifdef _FMVER21
  655. r =  ACMemberLeaveFM(index, fmname, fmindex, charname, flag,
  656. charindex, meindex);
  657. #else
  658. r =  ACMemberLeaveFM(index, fmname, fmindex, charname, flag, charindex);
  659. #endif
  660. if (r < 0){
  661. saacproto_ACMemberLeaveFM_send(fd, FAILED, charfdid);
  662. }else{
  663. saacproto_ACMemberLeaveFM_send(fd, SUCCESSFUL, charfdid);
  664. }
  665. #endif
  666. }
  667. #ifdef _FM_MODIFY
  668. void saacproto_ACFMCharLogin_recv(int fd, char *fmname, int fmindex,
  669. char *charname, char *charid, int charlv, int eventflag, int charfdid,int gsnum)
  670. #else
  671. #ifdef _FMVER21
  672. void saacproto_ACFMCharLogin_recv(int fd, char *fmname, int fmindex,
  673. char *charname, char *charid, int charlv, int eventflag, int charfdid)
  674. #else
  675. void saacproto_ACFMCharLogin_recv(int fd, char *fmname, int fmindex,
  676. char *charname, char *charid, int charlv, int charfdid)
  677. #endif
  678. #endif
  679. {
  680. #ifdef _FAMILY
  681. int r = 0, floor = 0, fmpopular = 0, joinflag = 0, fmsetupflag = 0;
  682. int flag = 0, charindex = 0;
  683. #ifdef _PERSONAL_FAME   // Arminius: 家族个人声望
  684. int charfame = 0;
  685. #endif
  686. #ifdef _NEW_MANOR_LAW
  687. int momentum = 0;
  688. #endif
  689. #ifdef _FM_MODIFY
  690. r =  ACFMCharLogin(fd, -1, fmname, fmindex, charname, charid, charlv,
  691. &floor, &fmpopular, &joinflag, &fmsetupflag, &charindex, charfdid,
  692. &charfame, eventflag,gsnum
  693. #ifdef _NEW_MANOR_LAW
  694. ,&momentum
  695. #endif
  696. );
  697. #else
  698. #ifdef _PERSONAL_FAME   // Arminius: 家族个人声望
  699. r =  ACFMCharLogin(fd, -1, fmname, fmindex, charname, charid, charlv,
  700. &floor, &fmpopular, &joinflag, &fmsetupflag, &charindex, charfdid,
  701. &charfame, eventflag);
  702. #else
  703. r =  ACFMCharLogin(fd, -1, fmname, fmindex, charname, charid, charlv,
  704. &floor, &fmpopular, &joinflag, &fmsetupflag, &charindex, charfdid);
  705. #endif
  706. #endif
  707. #ifdef _PERSONAL_FAME   // Arminius: 家族个人声望
  708. if (r < 0){
  709. saacproto_ACFMCharLogin_send(fd, FAILED, r, floor, fmpopular,
  710. joinflag, fmsetupflag, flag, charindex, charfame, charfdid
  711. #ifdef _NEW_MANOR_LAW
  712. ,momentum
  713. #endif
  714. );
  715. }else{
  716. saacproto_ACFMCharLogin_send(fd, SUCCESSFUL, r, floor, fmpopular,
  717. joinflag, fmsetupflag, flag, charindex, charfame, charfdid
  718. #ifdef _NEW_MANOR_LAW
  719. ,momentum
  720. #endif
  721. );
  722. }
  723. #else
  724. if (r < 0){
  725. saacproto_ACFMCharLogin_send(fd, FAILED, r, floor, fmpopular,
  726. joinflag, fmsetupflag, flag, charindex, charfdid);
  727. }else{
  728. saacproto_ACFMCharLogin_send(fd, SUCCESSFUL, r, floor, fmpopular,
  729. joinflag, fmsetupflag, flag, charindex, charfdid);
  730. }
  731. #endif
  732. #endif
  733. }
  734. void saacproto_ACFMCharLogout_recv(int fd, char *fmname, int fmindex,
  735. char *charname, char *charid, int charlv, int index,int charfdid)
  736. {
  737. #ifdef _FAMILY
  738. int r = 0;
  739. r =  ACFMCharLogout(index, fmname, fmindex, charname, charid, charlv,
  740. charfdid);
  741. if (r < 0){
  742. saacproto_ACFMCharLogout_send(fd, FAILED, charfdid);
  743. }else{
  744. saacproto_ACFMCharLogout_send(fd, SUCCESSFUL, charfdid);
  745. }
  746. #endif
  747. }
  748. void saacproto_ACFMReadMemo_recv(int fd, int index)
  749. {
  750. #ifdef _FAMILY
  751. int r = 0, dataindex;
  752. char data[15000];
  753. r =  ACFMReadMemo(index, &dataindex, data);
  754. if (r < 0){
  755. // saacproto_ACFMReadMemo_send(fd, FAILED, index, r, dataindex, "Nothing");
  756. }else{
  757. saacproto_ACFMReadMemo_send(fd, SUCCESSFUL, index, r, dataindex, data);
  758. }
  759. #endif
  760. }
  761.                 
  762. void saacproto_ACFMWriteMemo_recv(int fd, char *fmname, int fmindex,
  763. char *data, int index)
  764. {
  765. #ifdef _FAMILY
  766. int r = 0;
  767. r =  ACFMWriteMemo(index, fmname, fmindex, data);
  768. if (r < 0){
  769. saacproto_ACFMWriteMemo_send(fd, FAILED, index);
  770. }else{
  771. saacproto_ACFMWriteMemo_send(fd, SUCCESSFUL, index);
  772. }
  773. #endif
  774. }
  775. void saacproto_ACFMPointList_recv(int fd)
  776. {
  777. #ifdef _FAMILY
  778.         int r = 0;
  779.         char data[15000];
  780.         r =  ACFMPointList(data);
  781.         if (r < 0)
  782.         {
  783. //         saacproto_ACFMPointList_send(fd, FAILED, "nothing");
  784.         }else{
  785.          saacproto_ACFMPointList_send(fd, SUCCESSFUL, data);
  786.         }
  787. #endif
  788. }
  789. void saacproto_ACSetFMPoint_recv(int fd, char *fmname, int fmindex, 
  790. int index, int fmpointindex, int fl, int x, int y, int charfdid)
  791. {
  792. #ifdef _FAMILY
  793. int r = 0;
  794. r =  ACSetFMPoint(index, fmname, fmindex, fmpointindex, fl, x, y);
  795. if (r < 0){
  796. saacproto_ACSetFMPoint_send(fd, FAILED, r, charfdid);
  797. }else{
  798. saacproto_ACSetFMPoint_send(fd, SUCCESSFUL, r, charfdid);
  799. }
  800. #endif
  801. }
  802. void saacproto_ACFixFMPoint_recv(int fd, char *winfmname, int winfmindex, int winindex,
  803. char *losefmname, int losefmindex, int loseindex, int village)
  804. {
  805. #ifdef _FAMILY
  806. int r = 0;
  807. r =  ACFixFMPoint(winindex, winfmname, winfmindex,
  808. loseindex, losefmname, losefmindex, village);
  809. if (r < 0){
  810. saacproto_ACFixFMPoint_send(fd, FAILED, r);
  811. }else{
  812. saacproto_ACFixFMPoint_send(fd, SUCCESSFUL, r);
  813. }
  814. #endif
  815. }
  816. void saacproto_ACFMAnnounce_recv(int fd, char *fmname, int fmindex, int index,
  817.         char *data, int color)
  818. {
  819. #ifdef _FAMILY
  820. int r = 0, i = 0;
  821. r = ACFMAnnounce(fmname, fmindex, index, data, color);
  822. if (r < 0){
  823. saacproto_ACFMAnnounce_send(fd, FAILED, fmname, fmindex, index,
  824. 1, data, color);
  825. }else{
  826. extern gmsv gs[MAXCONNECTION];
  827. for (i = 0; i < MAXCONNECTION; i ++)
  828. {
  829.    if (gs[i].use && gs[i].name[0])
  830.    {
  831.       saacproto_ACFMAnnounce_send(i, SUCCESSFUL, fmname, fmindex,
  832.        index, 1, data, color);
  833.    }
  834. }
  835. }
  836. #endif
  837. }
  838. void saacproto_ACShowTopFMList_recv(int fd, int kindflag)
  839. {
  840. #ifdef _FAMILY
  841. int r = 0;
  842. char data[150 * MAX_FAMILY];
  843. strcpy(data, "");
  844. r =  ACShowTopFMList(data, sizeof(data), kindflag);
  845. if (r < 0) {
  846. // saacproto_ACShowTopFMList_send(fd, FAILED, kindflag, r, "Nothing");
  847. }else {
  848. saacproto_ACShowTopFMList_send(fd, SUCCESSFUL, kindflag, r, data);
  849. }
  850. #endif
  851. }
  852. void saacproto_ACFixFMData_recv(int fd, char *fmname, int fmindex, int index,
  853. int kindflag, char *data1, char *data2, int charindex, int charfdid)
  854. {
  855. #ifdef _FAMILY
  856. int r = 0;
  857. r =  ACFixFMData(index, fmname, fmindex, kindflag, charindex, data1, data2);
  858. if (r < 0){
  859. saacproto_ACFixFMData_send(fd, FAILED, kindflag, data1, data2, charfdid);
  860. }else{
  861. saacproto_ACFixFMData_send(fd, SUCCESSFUL, kindflag, data1, data2, charfdid);
  862. }
  863. #endif
  864. }
  865. void saacproto_ACFixFMPK_recv(int fd, char *winfmname, int winfmindex, int winindex,
  866. char *losefmname, int losefmindex, int loseindex)
  867. {
  868. #ifdef _FAMILY
  869. int r = 0;
  870. r =  ACFixFMPK(winindex, winfmname, winfmindex,
  871. loseindex, losefmname, losefmindex);
  872. if (r < 0){
  873. saacproto_ACFixFMPK_send(fd, FAILED, r, winindex,
  874. loseindex);
  875. }else{
  876. saacproto_ACFixFMPK_send(fd, SUCCESSFUL, r, winindex,
  877. loseindex);
  878. }
  879. #endif
  880. }
  881. void saacproto_ACGMFixFMData_recv(int fd, int index, char *charid, char *cmd,
  882. char *data, int charfdid)
  883. {
  884. #ifdef _FAMILY
  885. int r = 0;
  886. char fmname[256];
  887. r =  ACGMFixFMData(index, fmname, charid, cmd, data);
  888. if (r < 0){
  889. saacproto_ACGMFixFMData_send(fd, FAILED, fmname, charfdid);
  890. }
  891. else{
  892. saacproto_ACGMFixFMData_send(fd, SUCCESSFUL, fmname, charfdid);
  893. }
  894. #endif
  895. }
  896. void saacproto_ACGetFMData_recv(int fd, char *fmname, int fmindex, int index,
  897. int kindflag, int charfdid)
  898. {
  899. #ifdef _FAMILY
  900. int r = 0, data = 0;
  901. r =  ACGetFMData(index, fmname, fmindex, kindflag, &data);
  902. if (r < 0){
  903. saacproto_ACGetFMData_send(fd, FAILED, kindflag, data, charfdid);
  904. }else{
  905. saacproto_ACGetFMData_send(fd, SUCCESSFUL, kindflag, data, charfdid);
  906. }
  907. #endif
  908. }
  909. void saacproto_ACreLoadFmData_recv(int fd, int type, int data)
  910. {
  911. int i=0;
  912. extern gmsv gs[MAXCONNECTION];
  913. switch( type){
  914. case 1:
  915. log( "reload FM_DATA:%d !n", data);
  916. readOneFamilyFromTi( data);
  917. break;
  918. case 2:
  919. {
  920. char data[15000];
  921. readFMPoint( fmpointdir);
  922. if( ACFMPointList( data) >= 0 ){
  923. log( "reload FM_POINT !n" );
  924. for (i=0; i<MAXCONNECTION; i++){
  925. if( gs[i].use && gs[i].name[0] )
  926. saacproto_ACFMPointList_send( i, SUCCESSFUL, data);
  927. }
  928. }
  929. }
  930. break;
  931. case 3: //fmpk_list
  932. {
  933. int j=0;
  934. log( "reload FMPK_LIST !n" );
  935. FMPK_InitList();
  936. FMPK_LoadList();
  937. for( j=0; j<FMPKLIST_MAXNUM; j++){ 
  938. for (i=0; i<MAXCONNECTION; i++){
  939. if( gs[i].use && gs[i].name[0] )
  940. saacproto_ACLoadFmPk_send(i, FMPK_GetData( j) );
  941. }
  942. }
  943. }
  944. break;
  945. }
  946. }
  947. #ifdef _AC_SEND_FM_PK  // WON ADD 庄园对战列表储存在AC
  948. #ifdef _ACFMPK_LIST
  949. void saacproto_ACLoadFmPk_recv(int fd, int fmpks_pos)
  950. {
  951. if( fmpks_pos < 0 || fmpks_pos > MAX_FMPOINT) return;
  952. saacproto_ACLoadFmPk_send( fd, FMPK_GetData( fmpks_pos-1) );
  953. }
  954. void saacproto_ACSendFmPk_recv(int fd, int fmpks_pos, int userindex, int flg, char *data)
  955. {
  956. extern  gmsv gs[MAXCONNECTION];
  957. char buf[1024];
  958. int i=0;
  959. sprintf( buf, "%d|%s", fmpks_pos, data);
  960. if( ( userindex != -1 && FMPK_GetTypeFlg( fmpks_pos-1) == 1 )||
  961. FMPK_SetData( fmpks_pos-1, flg, buf, strlen( buf)) != 1 ){
  962. if(userindex != -1) saacproto_ACSendFmPk_send( fd, userindex, 0);
  963. log("err ACSendFmPk_send(%d, %d)n", userindex, 0);
  964. return;
  965. }
  966. FMPK_BackUpList();
  967. for (i=0; i<MAXCONNECTION; i++){
  968. if( gs[i].use && gs[i].name[0] ){
  969. saacproto_ACLoadFmPk_send(i, FMPK_GetData( fmpks_pos-1) );
  970. }
  971. }
  972. //送确认讯息
  973. if(userindex != -1) saacproto_ACSendFmPk_send( fd, userindex, 1);
  974. }
  975. #else
  976. void saacproto_ACLoadFmPk_recv(int fd, int fmpks_pos)
  977. {
  978. if(fmpks_pos > MAX_FMPOINT){
  979. log("n fmpks_pos(%d) too big", fmpks_pos);
  980. }
  981. saacproto_ACLoadFmPk_send(fd, fm_pk_list[fmpks_pos-1]);
  982. }
  983. void saacproto_ACSendFmPk_recv(int fd, int fmpks_pos, char *data)
  984. {
  985. extern  gmsv gs[MAXCONNECTION];
  986. int i=0;
  987. if( (fmpks_pos>MAX_FMPOINT) || (fmpks_pos<1) ){
  988. log("n fmpks_pos(%d) err !!", fmpks_pos);
  989. }
  990. sprintf(fm_pk_list[fmpks_pos-1], "%d|%s", fmpks_pos, data);
  991. for (i=0; i<MAXCONNECTION; i++){
  992. if (gs[i].use && gs[i].name[0] && i!=fd){
  993. saacproto_ACLoadFmPk_send(i, fm_pk_list[fmpks_pos-1]);
  994. }
  995. }
  996. save_fm_pk_list();
  997. }
  998. #endif
  999. #endif
  1000. void saacproto_ACManorPKAck_recv(int fd, char *data)
  1001. {
  1002. #ifdef _FAMILY
  1003. #ifdef _AC_SEND_FM_PK  // WON ADD 庄园对战列表储存在AC
  1004. // 不处理
  1005. #else
  1006. extern gmsv gs[MAXCONNECTION];
  1007. int i;
  1008. for (i=0; i<MAXCONNECTION; i++) 
  1009. {
  1010. if (gs[i].use && gs[i].name[0]) 
  1011. {
  1012. saacproto_ACManorPKAck_send(i, data);
  1013. }
  1014. }
  1015. #endif
  1016. #endif
  1017. }
  1018. #ifdef _WAEI_KICK
  1019. void saacproto_ACKick_recv( int ti ,char* id, int lock,int mesgid )
  1020. {
  1021. if( ti != -1 ) {
  1022. if( !is_game_server_login(ti) ){ //MAXCONNECTION
  1023. saacproto_ACKick_send( ti , 0 , "not login" , mesgid );
  1024. return;
  1025. }
  1026. }
  1027. sprintf(retdata, "ACTION !!");
  1028. //"LSLOCK","KICK","DEUNLOCK","UNLOCKALL","LOCK","TYPE", "UNLOCK"
  1029. switch( lock) {
  1030. case 0://LSLOCK
  1031. break;
  1032. case 1: //跨星球踢人 KICK
  1033. {
  1034. int i;
  1035. for(i=0;i<MAXCONNECTION;i++) {
  1036. if( is_game_server_login(i) ){
  1037. saacproto_ACKick_send( i , 1 , id , mesgid );
  1038. }
  1039. }
  1040. }
  1041. break;
  1042. case 2: //DEUNLOCK
  1043. break;
  1044. case 3: //UNLOCKALL
  1045. {
  1046. extern gmsv gs[MAXCONNECTION];
  1047. DeleteMemLockServer( gs[ti].name);
  1048. sprintf(retdata, "GM UNLOCK ALL");
  1049. }
  1050. break;
  1051. case 4: //LOCK
  1052. #ifdef _LOCK_ADD_NAME
  1053. if ( lockUser( getGSName( ti ) , id , "" , "0" , lock , result,sizeof(result),
  1054. retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
  1055. #else
  1056.   if ( lockUser( getGSName( ti ) , id , "0" , lock , result,sizeof(result),
  1057. retdata ,sizeof( retdata ) , "0" , "0") < 0 ) {
  1058. #endif
  1059. sprintf(retdata, "LOCK USER !!");
  1060.   }
  1061. break;
  1062. case 5: //查询玩家状态 TYPE
  1063. {
  1064. char buf[4096];
  1065. if (GetMemLockState(getHash(id) & 0xff, id, buf)) {
  1066. sprintf(retdata, "USR LOCKED: %s", buf);
  1067. } else {
  1068. sprintf(retdata, "USR UNLOCKED: %s", buf);
  1069. }
  1070. }
  1071. break;
  1072. case 6: //MEMORY UNLOCK; UNLOCK
  1073. {
  1074. char result[100], retdata[100], process[16];
  1075. int ret = 0;
  1076. #ifdef _LOCK_ADD_NAME
  1077. ret = lockUser(  getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) ,
  1078.                        retdata , sizeof( retdata ) , "0" , "0");
  1079. #else
  1080.         ret = lockUser(  getGSName(ti), id , "0" , 0 , result , sizeof( result ) ,
  1081.                        retdata , sizeof( retdata ) , "0" , "0");
  1082. #endif
  1083. if( strcmp( result , SUCCESSFUL ) == 0 ){
  1084. log( "解锁账号 %s 成功!n" , id );
  1085. } else {
  1086. log( "解锁账号 %s 失败!n" , id );
  1087. return;
  1088. }
  1089. snprintf( process , sizeof(process) , "%d" , ret );
  1090. dummyCallback(ti,0,id,"dummy",charname,process,"",mesgid,0);
  1091. }
  1092. break;
  1093. case 10: //跨星球踢人不含load该星球
  1094. {
  1095. int i;
  1096. for(i=0;i<MAXCONNECTION;i++) {
  1097. if( is_game_server_login(i) && i != ti ){
  1098. saacproto_ACKick_send( i , 1 , id , mesgid );
  1099. }
  1100. }
  1101. }
  1102. }
  1103.     saacproto_ACKick_send( ti, 0, retdata, mesgid );
  1104. }
  1105. #endif
  1106. #ifdef _SEND_EFFECT    // WON ADD 送下雪、下雨等特效
  1107. void SendEffect(char *effect)
  1108. {
  1109.     extern gmsv gs[MAXCONNECTION];
  1110. int i;
  1111. for (i=0; i<MAXCONNECTION; i++) {
  1112. if (gs[i].use && gs[i].name[0]) {
  1113. saacproto_SendEffect_send(i, effect);
  1114. }
  1115. }
  1116. }
  1117. #endif
  1118. #ifdef _AC_SEND_FM_PK  // WON ADD 庄园对战列表储存在AC
  1119. void load_fm_pk_list()
  1120. {
  1121. int i;
  1122. char *filename={"data/family/fm_pk_list.txt"};
  1123. FILE *fp;
  1124. if( !(fp=fopen(filename, "r"))  ){
  1125. return;
  1126. }
  1127. for( i=0; i<FMPKLIST_MAXNUM; i++){
  1128. char buf[256];
  1129. if( fscanf( fp, "%s", buf) == EOF ) break;
  1130. buf[strlen(buf)+1] = 0;
  1131. memcpy( fm_pk_list[i], buf, strlen(buf)+1);
  1132. }
  1133. fclose( fp);
  1134. log("n");
  1135. }
  1136. void save_fm_pk_list()
  1137. {
  1138. int i;
  1139. char *filename={"data/family/fm_pk_list.txt"};
  1140. FILE *fp;
  1141. if( !(fp=fopen(filename, "w"))  ){
  1142. return;
  1143. }
  1144. for( i=0; i<FMPKLIST_MAXNUM; i++){
  1145. fprintf(fp, "%sn", fm_pk_list[i]);
  1146. }
  1147. fclose( fp);
  1148. }
  1149. #endif
  1150. #ifdef _CHAR_POOLITEM
  1151. void saacproto_ACCharInsertPoolItem_recv( int fd, char *cdkey, int userindex, int clifdid, char *Pooldataarg)
  1152. {
  1153. if( !is_game_server_login( fd) ){
  1154.         return;
  1155.     }
  1156. if( InsertCharPoolItem( cdkey, Pooldataarg, strlen(Pooldataarg)) <= 0 ) {
  1157. log("n InsertPoolItem( %s) err!!n", cdkey);
  1158. saacproto_ACCharSavePoolItem_send( fd , FAILED , Pooldataarg, clifdid );
  1159. }
  1160. }
  1161. void saacproto_ACCharSavePoolItem_recv( int fd, char *cdkey, int userindex, int clifdid, char *Pooldataarg)
  1162. {
  1163. if( !is_game_server_login( fd) ){
  1164.         return;
  1165.     }
  1166. if( saveCharPoolItem( cdkey, Pooldataarg, strlen(Pooldataarg)) < 0 ) {
  1167. saacproto_ACCharSavePoolItem_send( fd , FAILED , Pooldataarg, clifdid );
  1168. }
  1169. }
  1170. void saacproto_ACCharGetPoolItem_recv( int fd, char *cdkey, int userindex, int clifdid, int npcid)
  1171. {
  1172. char loadbuf[CHARDATASIZE];
  1173. int ret=-1;
  1174. if( !is_game_server_login( fd) ){
  1175.         return;
  1176.     }
  1177. ret = loadCharPoolItemOne( cdkey , loadbuf , sizeof(loadbuf));
  1178. if( ret == -1 ){//找不到档案
  1179. saacproto_ACCharGetPoolItem_send( fd , FAILED, loadbuf, clifdid, npcid);
  1180. return;
  1181. }
  1182. saacproto_ACCharGetPoolItem_send( fd , SUCCESSFUL, loadbuf, clifdid, npcid);
  1183. }
  1184. #endif
  1185. #ifdef _CHAR_POOLPET
  1186. void saacproto_ACCharInsertPoolPet_recv( int fd, char *cdkey, int userindex, int clifdid, char *Pooldataarg)
  1187. {
  1188. if( !is_game_server_login( fd) ){
  1189.         return;
  1190.     }
  1191. if( InsertCharPoolPet( cdkey, Pooldataarg, strlen(Pooldataarg)) <= 0 ) {
  1192. log("n InsertPoolPet( %s) err!!n", cdkey);
  1193. saacproto_ACCharSavePoolPet_send( fd , FAILED , Pooldataarg, clifdid );
  1194. }
  1195. }
  1196. void saacproto_ACCharSavePoolPet_recv( int fd, char *cdkey, int userindex, int clifdid, char *Pooldataarg)
  1197. {
  1198. if( !is_game_server_login( fd) ){
  1199.         return;
  1200.     }
  1201. if( saveCharPoolPet( cdkey, Pooldataarg, strlen(Pooldataarg)) < 0 ) {
  1202. saacproto_ACCharSavePoolPet_send( fd , FAILED , Pooldataarg, clifdid );
  1203. }
  1204. }
  1205. void saacproto_ACCharGetPoolPet_recv( int fd, char *cdkey, int userindex, int clifdid, int npcid)
  1206. {
  1207. char loadbuf[CHARDATASIZE];
  1208. int ret=-1;
  1209. if( !is_game_server_login( fd) ){
  1210.         return;
  1211.     }
  1212. ret = loadCharPoolPetOne( cdkey , loadbuf , sizeof(loadbuf));
  1213. if( ret == -1 ){//找不到档案
  1214. saacproto_ACCharGetPoolPet_send( fd , FAILED, loadbuf, clifdid, npcid);
  1215. return;
  1216. }
  1217. saacproto_ACCharGetPoolPet_send( fd , SUCCESSFUL, loadbuf, clifdid, npcid);
  1218. }
  1219. #endif
  1220. #ifdef _ALLDOMAN // Syu ADD 排行榜NPC
  1221. void LOAD_herolist()
  1222. {
  1223. FILE *fdb;
  1224. int i, linenum=0;
  1225. char filename[256], token[512];
  1226. snprintf( filename , sizeof( filename ) ,"%s/%s" , "db/herolist","db_herolist.txt");
  1227. if( !( fdb = fopen ( filename , "r+" ) ) ) {
  1228. log("nSyu log open db_herolist.txt error!!");
  1229. return ; 
  1230. }else {
  1231. char *addr;
  1232. fread ( &token , sizeof ( token ) , 1 , fdb ) ;
  1233. fclose ( fdb ) ; 
  1234. do {
  1235. for ( i = 0 ; i < MAX_HERO_COLUMN ; i ++ ) {
  1236. easyGetTokenFromBuf( token , "|", i + 1 , Herolist[ linenum ][ i ] , sizeof( Herolist[ linenum ][ i ] ) );
  1237. }
  1238. linenum ++;
  1239. if ( (addr = strstr ( token , "n" )) ) 
  1240. strcpy ( token , addr + 1 ) ;
  1241. else 
  1242. break;
  1243. } while ( 1 ) ;
  1244. }
  1245. }
  1246. void SAVE_herolist (int fd)
  1247. {
  1248. int i ; 
  1249. FILE *fdb;
  1250. char filename[256];
  1251. snprintf( filename , sizeof( filename ) ,"%s/%s" , "db/herolist","db_herolist.txt");
  1252. if( !( fdb = fopen ( filename , "w" ) ) ) {
  1253. log("nSyu log open db_herolist.txt error!!");
  1254. return ; 
  1255. }else {
  1256. char tmp[256];
  1257. for ( i = 0 ; i < MAX_HERO_LIST ; i ++ ) {
  1258. sprintf( tmp , "%s|%s|%s|%d|%d|%d|%dn" , 
  1259. Herolist[i][0] , 
  1260. Herolist[i][1] , 
  1261. Herolist[i][2] , 
  1262. atoi (Herolist[i][3]) , 
  1263. atoi (Herolist[i][4]) , 
  1264. atoi (Herolist[i][5]) , 
  1265. atoi (Herolist[i][6]) );
  1266. fwrite(tmp, strlen(tmp), 1, fdb );
  1267. }
  1268. fclose ( fdb ) ; 
  1269. }
  1270. }
  1271. void Send_A_herolist( int fd )
  1272. {
  1273. FILE *fdb;
  1274. int lens=0;
  1275. char filename[256],buf[256];
  1276. snprintf( filename , sizeof( filename ) ,"%s/%s" , "db/herolist","db_herolist.txt");
  1277. if( !( fdb = fopen ( filename , "r+" ) ) ) {
  1278. log("n Syu log open db_herolist.txt error!!");
  1279. return ; 
  1280. }else {
  1281. char token[100 * 100];
  1282. memset( token, 0, sizeof(token));
  1283. memset( buf, 0, sizeof(buf));
  1284. while( fgets( buf , sizeof( buf ) , fdb )){
  1285. buf[strlen(buf)] = 0 ;
  1286. if( lens+strlen(buf) >= 65535 ){
  1287. saacproto_UpdataStele_send ( fd , token );
  1288. memset( token, 0, sizeof(token));
  1289. lens = 0;
  1290. }
  1291. strcat( token, buf);
  1292. lens += strlen( buf);
  1293. }
  1294. fclose ( fdb );
  1295. if( strlen( token) > 0 )
  1296. saacproto_UpdataStele_send ( fd , token ); 
  1297. }
  1298. }
  1299. void Send_S_herolist( char *ocdkey , char *oname , char *ncdkey , char *nname , 
  1300.  char *title , int level , int trns , int floor ) 
  1301. {
  1302. int i;
  1303.     extern gmsv gs[MAXCONNECTION];
  1304. for (i = 0 ; i < MAXCONNECTION ; i ++ ) {
  1305. if ( gs[i].use && gs[i].name[0] ) {
  1306. saacproto_S_UpdataStele_send( i , ocdkey , oname ,
  1307. ncdkey , nname , title
  1308. , level , trns , floor );
  1309. log("nSyu log AC Send Single to Gmsv ");
  1310. }
  1311. }
  1312. }
  1313. #endif
  1314. #define MAXUNlockM 50
  1315. #define delaytime (60*3)
  1316. UNLockMenus UNlockM[MAXUNlockM];
  1317. int UNlockM_Init( void)
  1318. {
  1319. int i;
  1320. for( i=0; i<MAXUNlockM; i++) {
  1321. memset( UNlockM[i].PlayerId, 0, sizeof( UNlockM[i].PlayerId));
  1322. UNlockM[i].use = 0;
  1323. UNlockM[i].time = 0;
  1324. }
  1325. return 1;
  1326. }
  1327. void reset_UNlockMPlayer( int ti)
  1328. {
  1329. memset( UNlockM[ti].PlayerId, 0, sizeof( UNlockM[ti].PlayerId));
  1330. UNlockM[ti].use = 0;
  1331. UNlockM[ti].time = 0;
  1332. }
  1333. int UNlockM_isBe( char *id)
  1334. {
  1335. int i;
  1336. for( i=0; i<MAXUNlockM; i++) {
  1337. if( UNlockM[i].use == 0 )continue;
  1338. if( !strcmp( UNlockM[i].PlayerId, id ) ) return 1;
  1339. }
  1340. return 0;
  1341. }
  1342. //andy add 2002/06/20
  1343. int UNlockM_addPlayer( char *id)
  1344. {
  1345. int i, post=-1;
  1346. for( i=0; i<MAXUNlockM; i++) {
  1347. if( UNlockM[i].use == 0 ){
  1348. post = i;
  1349. continue;
  1350. }
  1351. if( !strcmp( UNlockM[i].PlayerId, id ) ){
  1352. reset_UNlockMPlayer( i);
  1353. return -1;
  1354. }
  1355. }
  1356. if( post == -1 )return -1;
  1357. memset( UNlockM[post].PlayerId, 0, sizeof( UNlockM[post].PlayerId));
  1358. sprintf( UNlockM[post].PlayerId, "%s", id);
  1359. UNlockM[post].use = 1;
  1360. UNlockM[post].time = time(NULL)+delaytime;
  1361. return post;
  1362. }
  1363. //andy add 2002/06/20
  1364. int UNlockM_UnlockPlayer( void)
  1365. {
  1366. int i, nums=0;
  1367. static int UnlockClock = 0;
  1368. if( (++UnlockClock)<60 != 0 ) return 0;
  1369. //log(" UNlockM_UnlockPlayer ");
  1370. UnlockClock =0;
  1371. for( i=0; i<MAXUNlockM; i++) {
  1372. if( !UNlockM[i].use ) continue;
  1373. if( UNlockM[i].time >= time(NULL) ) continue;
  1374. if( isLocked( UNlockM[i].PlayerId ) ){
  1375. log( "等待解锁玩家: %s 还需锁定!!n", UNlockM[i].PlayerId);
  1376. }else{
  1377. log( "等待解锁玩家: %s 已经解锁!!n", UNlockM[i].PlayerId);
  1378. }
  1379. reset_UNlockMPlayer( i);
  1380. nums++;
  1381. }
  1382. //log( "等待解锁玩家: 总计 %d 个用户解锁 !!n", nums);
  1383. return nums;
  1384. }
  1385. #ifdef _ANGEL_SUMMON
  1386. extern int saveMissionTable( void );
  1387. //void saacproto_ACMissionTable_recv( int fd, int num, int type, char *data, int charaindex)
  1388. void saacproto_ACMissionTable_recv( int fd, int num, int type, char *data, char* angelinfo)
  1389. {
  1390. extern  gmsv gs[MAXCONNECTION];
  1391. int i;
  1392. char buf[1024];
  1393. if( type == 1 ) { // ask data list
  1394. if( num == -1) { // ask all data
  1395. char alldata[MAXMISSIONTABLE*100];
  1396. alldata[0]='';
  1397. for( i =0; i <MAXMISSIONTABLE; i++) {
  1398. if( missiontable[i].flag == MISSION_NONE)
  1399. continue;
  1400. sprintf( buf, "%d|%s|%s|%d|%d|%d|%d ",
  1401. i,
  1402. missiontable[i].angelinfo,
  1403. missiontable[i].heroinfo,
  1404. missiontable[i].mission,
  1405. missiontable[i].flag,
  1406. missiontable[i].time,
  1407. missiontable[i].limittime );
  1408. strcat( alldata, buf);
  1409. }
  1410. saacproto_ACMissionTable_send( fd, -1, 1, alldata, "");
  1411. return;
  1412. }
  1413. /*
  1414. else { // ask one data
  1415. sprintf( buf, "%d|%s|%s|%d|%d|%d ",
  1416. num,
  1417. missiontable[num].angelinfo,
  1418. missiontable[num].heroinfo,
  1419. missiontable[num].mission,
  1420. missiontable[num].flag,
  1421. missiontable[num].time );
  1422. saacproto_ACMissionTable_send( fd, 1, 1, buf, "");
  1423. return;
  1424. }
  1425. */
  1426. }
  1427. else if( type == 2 ) { // add data
  1428. int empty =-1;
  1429. log("n增加精灵召唤任务:%s n", data);
  1430. for( i =0; i <MAXMISSIONTABLE; i++) {
  1431. if( missiontable[i].angelinfo[0] == '' ) {
  1432. empty = i;
  1433. break;
  1434. }
  1435. }
  1436. if( empty == -1) {
  1437. saacproto_ACMissionTable_send( fd, -1, 2, "", angelinfo);
  1438. return;
  1439. }
  1440. easyGetTokenFromBuf( data, "|", 1, buf, sizeof( buf));
  1441. strcpy( missiontable[empty].angelinfo, buf);
  1442. easyGetTokenFromBuf( data, "|", 2, buf, sizeof( buf));
  1443. strcpy( missiontable[empty].heroinfo, buf);
  1444. easyGetTokenFromBuf( data, "|", 3, buf, sizeof( buf));
  1445. missiontable[empty].mission = atoi( buf);
  1446. easyGetTokenFromBuf( data, "|", 4, buf, sizeof( buf));
  1447. missiontable[empty].flag = atoi( buf);
  1448. //easyGetTokenFromBuf( data, "|", 5, buf, sizeof( buf));
  1449. //missiontable[empty].time = atoi( buf);
  1450. missiontable[empty].time = (int)time(NULL);
  1451. missiontable[empty].limittime = 1;
  1452. saveMissionTable();
  1453. sprintf( buf, "%d|%s|%s|%d|%d|%d|%d ",
  1454. empty,
  1455. missiontable[empty].angelinfo,
  1456. missiontable[empty].heroinfo,
  1457. missiontable[empty].mission,
  1458. missiontable[empty].flag,
  1459. missiontable[empty].time,
  1460. missiontable[empty].limittime );
  1461. for( i=0; i<MAXCONNECTION; i++) {
  1462. if (gs[i].use && gs[i].name[0]) {
  1463. saacproto_ACMissionTable_send( i, 1, 1, buf, "");
  1464. }
  1465. }
  1466. saacproto_ACMissionTable_send( fd, 0, 2, "", angelinfo);
  1467. return;
  1468. }
  1469. else if( type == 3 ) { // del data
  1470. delMissionTableOnedata( num);
  1471. saveMissionTable();
  1472. return;
  1473. }
  1474. else if( type == 4 ) { // change data flag
  1475. char angelinfo[64];
  1476. int limittime;
  1477. log("n增加精灵召唤任务:%s:%d n", data, num);
  1478. if( num == MISSION_DOING ) {
  1479. easyGetTokenFromBuf( data, "|", 1, buf, sizeof( buf));
  1480. strcpy( angelinfo, buf);
  1481. easyGetTokenFromBuf( data, "|", 2, buf, sizeof( buf));
  1482. limittime = atoi( buf);
  1483. }
  1484. else {
  1485. strcpy( angelinfo, data);
  1486. }
  1487. for( i =0; i <MAXMISSIONTABLE; i++) {
  1488. if( missiontable[i].angelinfo[0] == '' )
  1489. continue;
  1490. if( strcmp( missiontable[i].angelinfo, angelinfo)
  1491. && strcmp( missiontable[i].heroinfo, angelinfo) )
  1492. continue;
  1493. missiontable[i].flag = num;
  1494. missiontable[i].time = time(NULL);
  1495. if( num == MISSION_DOING ) {
  1496. missiontable[i].limittime = limittime;
  1497. }
  1498. saveMissionTable();
  1499. sprintf( buf, "%d|%s|%s|%d|%d|%d|%d ",
  1500. i,
  1501. missiontable[i].angelinfo,
  1502. missiontable[i].heroinfo,
  1503. missiontable[i].mission,
  1504. missiontable[i].flag,
  1505. missiontable[i].time,
  1506. missiontable[i].limittime );
  1507. for( i=0; i<MAXCONNECTION; i++) {
  1508. if (gs[i].use && gs[i].name[0]) {
  1509. saacproto_ACMissionTable_send( i, 1, 1, buf, "");
  1510. }
  1511. }
  1512. return;
  1513. }
  1514. }
  1515. }
  1516. #endif
  1517. #ifdef _TEACHER_SYSTEM
  1518. void saacproto_ACCheckCharacterOnLine_recv( int fd, int charaindex, char *id, char *name, int flag)
  1519. {
  1520. LockNode *ln = userlock[getHash(id) & 0xff];
  1521. // 须要确认名字
  1522. if(name != NULL){
  1523. while(ln != NULL){
  1524. if(ln->use != 0){
  1525. if(strcmp(ln->cdkey,id) == 0 && strcmp(ln->name,name) == 0){
  1526. saacproto_ACCheckCharacterOnLine_send(fd,charaindex,1,ln->server,flag);
  1527. return;
  1528. }
  1529. }
  1530. ln = ln->next;
  1531. }
  1532. // 玩家不在线上
  1533. saacproto_ACCheckCharacterOnLine_send(fd,charaindex,0,"",flag);
  1534. }
  1535. // 不须要确认名字
  1536. else{
  1537. while(ln != NULL){
  1538. if(ln->use != 0){
  1539. if(strcmp(ln->cdkey,id) == 0){
  1540. saacproto_ACCheckCharacterOnLine_send(fd,charaindex,1,ln->server,flag);
  1541. return;
  1542. }
  1543. }
  1544. ln = ln->next;
  1545. }
  1546. // 玩家不在线上
  1547. saacproto_ACCheckCharacterOnLine_send(fd,charaindex,0,"",flag);
  1548. }
  1549. }
  1550. #endif
  1551. void saacproto_ACCharLogin_recv( int fd, int clifd, char* id, char* pas, char* ip )
  1552. {
  1553. int res;
  1554. #ifdef _SASQL
  1555. if (strlen(id)==0 || strlen(pas)==0 || strlen(ip)==0){
  1556.   printf("登陆信息有错误!n");
  1557.   saacproto_ACCharLogin_send( fd, clifd, 0);
  1558.   return;
  1559. }
  1560. if (sasql_chehk_lock(id)){
  1561. printf("该账号%s禁止登陆!n",id);
  1562.   saacproto_ACCharLogin_send( fd, clifd, 0);
  1563.   return;
  1564. }
  1565. if (sasql_chehk_lock(ip)){
  1566. printf("该IP%s禁止登陆!n",ip);
  1567.   saacproto_ACCharLogin_send( fd, clifd, 0);
  1568.   return;
  1569. }
  1570. res=sasql_query(id,pas);
  1571. if (res==3){
  1572. #ifdef _SQL_REGISTER
  1573. if(!sasql_register(id,pas))
  1574. #endif
  1575. {
  1576. saacproto_ACCharLogin_send( fd, clifd, 0);
  1577.    return;
  1578. }
  1579. }else if (res!=1){
  1580. saacproto_ACCharLogin_send( fd, clifd, 0);
  1581.   return;
  1582. }
  1583. #endif
  1584. saacproto_ACCharLogin_send( fd , clifd, 1);
  1585. }
  1586. #ifdef _SASQL
  1587. void saacproto_LockLogin_recv( int fd, char* id, char* ip, int flag )
  1588. {
  1589. switch (flag){
  1590. case 0:
  1591. if(strlen(id)>0)
  1592. if(sasql_del_lock(id))
  1593. log("成功解除锁定账号:%sn",id);
  1594. if(strlen(ip)>0)
  1595. if(sasql_del_lock(ip))
  1596. log("成功解除锁定IP:%sn",ip);
  1597. break;
  1598. case 1:
  1599. if(strlen(id)>0)
  1600. if(!sasql_chehk_lock(id))
  1601. if(sasql_add_lock(id))
  1602. log("成功锁定账号:%sn",id);
  1603. if(strlen(ip)>0)
  1604. if(!sasql_chehk_lock(ip))
  1605. if(sasql_add_lock(ip))
  1606. log("成功锁定IP:%sn",ip);
  1607. break;
  1608. default:
  1609. break;
  1610. }
  1611. }
  1612. #endif