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

模拟服务器

开发平台:

C/C++

  1. #define _CHAR_C_
  2. // Spock +1 2000/12/6
  3. #include <time.h>
  4. #include <stdio.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <unistd.h>
  9. #include "main.h"
  10. #include "char.h"
  11. #include "saacproto_serv.h"
  12. #include "util.h"
  13. // CoolFish: Family 2001/6/12
  14. #include "acfamily.h"
  15. #include "version.h"
  16. // Arminius 7.17 memory lock
  17. #include "lock.h"
  18. #include "recv.h"
  19. #ifdef _SASQL
  20. #include "sasql.h"
  21. #endif
  22. static void getCharNameFromString(char *str ,char *out );
  23. static void getCharOptionFromString( char *str , char *out );
  24. static void makeCharFileName( char *idstring ,char *output, int outlen,int num);
  25. // Nuke *1*1
  26. static int makeSaveCharString( char *out , int outlen ,
  27. char *nm , char *opt , char *info );
  28. static int findBlankCharIndex( char *id  );
  29. static int unlinkCharFile( char *id , int num );
  30. #ifdef _SLEEP_CHAR // 取得非活跃人物档名
  31. static void makeSleepCharFileName( char *id,char *output, int outlen, int num);
  32. static void makeSleepCharPoolItemFileName( char *id,char *output, int outlen);
  33. static void makeSleepCharPoolPetFileName( char *id,char *output, int outlen);
  34. static void makeCharPoolPetFileName( char *id,char *output, int outlen);
  35. #endif
  36. #ifdef _CHAR_POOLITEM
  37. static void makeCharPoolItemFileName( char *id,char *output, int outlen);
  38. #endif
  39. #define SPACE '|'
  40. #define SPACESTRING "|"
  41. #define IS_2BYTEWORD( _a_ ) ( (char)(0x80) <= (_a_) && (_a_) <= (char)(0xFF) )
  42. #define USERLOG( id , format, args...)    
  43. {
  44. char body[1000];
  45. char fn[1000];
  46. if(id[0]){
  47. snprintf( body ,sizeof(body), "%s.log.%d" , id ,get_rotate_count() );
  48. makeDirFilename( fn , sizeof(fn),logdir, getHash(id), body);
  49. LOGBASE( fn , "%u " , (unsigned int ) time(NULL) );
  50. LOGBASE( fn , format , ## args );
  51. }
  52. }
  53. #ifdef _ANGEL_SUMMON
  54. struct MissionTable missiontable[MAXMISSIONTABLE];
  55. #endif
  56. /*
  57. 仇及白央奶伙匹烂聒今木化中月楮醒反兮氏少  据毛勾井丹[
  58. char *c0 : ID
  59. char *c1 : Passwd  手丹  据允氏匹月井日银歹卅中
  60. char *c2 : Charname
  61. char *c3 : opt
  62. Spock fixed, opt change to process
  63. char *c3 : process
  64. char *c4 : 勾井歹氏
  65. int i0 : lock  
  66. int i1 : mesgid 
  67. */
  68. void charLoadCallback( int ti , int auth , char *c0, char* c1 ,
  69. char *c2 , char *c3, char *c4, int i0 , int i1 )
  70. {
  71. // Spock deleted 2000/11/2
  72. //static int process_id = 0;
  73. // CoolFish: Init charindex 2001/10/16
  74. #ifdef _NewSave
  75. int charindex = -1;
  76. #else
  77. int charindex;
  78. #endif
  79. char loadbuf[CHARDATASIZE];
  80. char infobuf[CHARDATASIZE];
  81. int lock = i0;
  82. char *process = c3;
  83. char *id = c0;
  84. char *passwd = c1;
  85. char *charname = c2;
  86. int mesgid = i1;
  87. char *deadline = c4;
  88. // Spock deleted 2000/11/2
  89. //process_id++;
  90. if( auth != 0 ){
  91. char data[100];
  92. snprintf( data,  sizeof( data ), "%d" , auth );
  93. #ifdef _NewSave
  94. saacproto_ACCharLoad_send( ti , FAILED , data, mesgid, charindex );
  95. #else
  96. saacproto_ACCharLoad_send( ti , FAILED , data, mesgid );
  97. #endif
  98. return;
  99. }
  100.     if( isLocked( id ) ){
  101. int process=atoi(c3);
  102. #ifdef _NewSave
  103. saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex );
  104. #else
  105. saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid );
  106. #endif
  107. DeleteMemLock(getHash(id) & 0xff, id, &process); // 如果AP无锁则AC解锁
  108. log("n (%s) AC同一星系重覆登入,踢人!! ", id );
  109. saacproto_ACKick_recv( ti, id, 1, -1); //踢人
  110. checkGSUCheck(id);
  111. return;
  112.     }
  113.     charindex = getCharIndexByName( id , charname );
  114. #ifdef _NewSave
  115.     //log("n档案装载序号:%d 账号:%s 名字:%sn", charindex, id, charname);
  116. #endif
  117.     if( charindex < 0 ){
  118. /* 平乓仿互绣箕仄卅中及匹巨仿□卅及分 */
  119. #ifdef _NewSave
  120. saacproto_ACCharLoad_send( ti , FAILED ,
  121. "char nonexistent" , mesgid , charindex );
  122. #else
  123. saacproto_ACCharLoad_send( ti , FAILED ,
  124. "char nonexistent" , mesgid );
  125. #endif
  126. return;
  127.     }
  128. //    log( "loadCharOne: id:[%s] char:[%s]n", id, charname );
  129.     
  130.     if( loadCharOne( id , charindex ,  loadbuf ,sizeof( loadbuf ))<0){
  131. #ifdef _NewSave
  132. saacproto_ACCharLoad_send( ti , FAILED ,
  133. "cannot load ( disk i/o error?)", mesgid, charindex );
  134. #else
  135. saacproto_ACCharLoad_send( ti , FAILED ,
  136. "cannot load ( disk i/o error?)", mesgid );
  137. #endif
  138. return;
  139.     }else{
  140. #ifdef _CHAR_POOLITEM
  141. checkCharPoolItem( id);
  142. #endif
  143. #ifdef _CHAR_POOLITEM
  144. checkCharPoolPet( id);
  145. #endif
  146. }
  147.     {//ttom
  148. char *c_ptr;
  149. c_ptr=loadbuf;
  150. while(*c_ptr!=''){
  151. if( IS_2BYTEWORD(*c_ptr) ){
  152. if(*(c_ptr+1)==' '){
  153. *(c_ptr+1)=0x41;
  154. }
  155. c_ptr++;
  156. if(*c_ptr=='') break;
  157. }
  158. c_ptr++;
  159. }
  160.     }//ttom
  161.     if( lock ){
  162. char result[100];
  163. char retdata[100];
  164. #ifdef _LOCK_ADD_NAME
  165. if( lockUser( getGSName(ti) , id , charname, passwd , 1 , result , sizeof( result ) ,
  166. retdata , sizeof( retdata ) , process , deadline) <0 ){
  167. #else
  168. // Spock 2000/11/2
  169. if( lockUser( getGSName(ti) , id , passwd , 1 , result , sizeof( result ) ,
  170. retdata , sizeof( retdata ) , process , deadline) <0 ){
  171. #endif
  172. saacproto_ACCharLoad_send( ti , FAILED, "lock FAIL!!" , mesgid , charindex );
  173. return;
  174. }
  175.     }
  176. memset( infobuf , 0 , sizeof( infobuf ));
  177. getCharInfoFromString( loadbuf , infobuf );
  178. makeStringFromEscaped( infobuf );
  179. #ifdef _NewSave
  180.     saacproto_ACCharLoad_send( ti ,  SUCCESSFUL , infobuf , mesgid, charindex );
  181. #else
  182.     saacproto_ACCharLoad_send( ti ,  SUCCESSFUL , infobuf , mesgid);
  183. #endif
  184. #ifdef _WAEI_KICK
  185. saacproto_ACKick_recv( ti, id, 10, -1); //踢其他星系
  186. #endif
  187. }
  188. #ifdef _NewSave
  189. int charSave( int ti ,  char *id , 
  190.  char *charname , char *opt , char *charinfo,
  191.  int unlock , int mesgid , int charindex)
  192. #else
  193. int charSave( int ti ,  char *id , 
  194.  char *charname , char *opt , char *charinfo,
  195.  int unlock , int mesgid )
  196. #endif
  197. {
  198. #ifdef _NewSave
  199. #else
  200. int charindex;
  201. #endif
  202. char savebuf[CHARDATASIZE];
  203. int ret = -1;
  204. memset(savebuf, 0, sizeof(savebuf));
  205. //andy_log
  206. if( strstr( charinfo, "DATAEND=") == NULL ){
  207. FILE *fp;
  208. if( (fp=fopen( "badpetstring.txt", "a+")) != NULL ){
  209. fprintf( fp, "%sn", charinfo);
  210. fclose( fp);
  211. }
  212. log( "err add batpetstring.txt:%s[%s] !n", id, charname);
  213. }
  214. if( unlock ){
  215. char result[100];
  216. char retdata[100];    
  217. #ifdef _LOCK_ADD_NAME    
  218. if( (ret = lockUser(  getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) ,
  219. retdata , sizeof( retdata ) , "0" , "0")) < 0 ){
  220. #else
  221. if( (ret = lockUser(  getGSName(ti), id , "0" , 0 , result , sizeof( result ) ,
  222. retdata , sizeof( retdata ) , "0" , "0")) < 0 ){
  223. #endif
  224. log( "解锁:%s 失败!!n", id);
  225. }
  226. }
  227. // Nuke *1 add escape
  228. if( makeSaveCharString( savebuf , sizeof( savebuf ) ,
  229. charname, opt , charinfo )<0){
  230. log("n AC存档:太长  ");
  231. saacproto_ACCharSave_send( ti , FAILED , "too long" , mesgid );
  232. // Spock fixed 2000/11/1
  233. return ret;
  234. }
  235. #ifdef _NewSave
  236. if (charindex == -1)
  237. charindex = getCharIndexByName( id , charname );
  238. #else
  239. // Nuke *1-
  240. charindex = getCharIndexByName( id , charname );
  241. #endif
  242. if( charindex < 0 ){
  243. int blankind = findBlankCharIndex( id );
  244. if( blankind < 0 ){
  245. log("n ACCharSave:char full  ");
  246. saacproto_ACCharSave_send( ti , FAILED , "char full" ,mesgid);
  247. return ret;
  248. } else {
  249. charindex = blankind;
  250. }
  251. }
  252. log( "账号:[%s] 人物:[%s]n", id, charname );
  253. if( saveCharOne( id , charindex , savebuf ) < 0 ){
  254. log("n ACCharSave:disk I/O error or a bug  ");
  255. saacproto_ACCharSave_send( ti , FAILED , "disk I/O error or a bug", mesgid );
  256. return ret;
  257. }
  258. saacproto_ACCharSave_send( ti ,  SUCCESSFUL , "" , mesgid);
  259. return ret;
  260. }
  261. void  charListCallback( int ti , int auth , char *c0 , char *c1 ,
  262.  char *c2 , char *c3 , char *c4 , int i0 , int i1 )
  263. {
  264. char listbuf[CHARDATASIZE];
  265. char *id = c0;
  266. int mesgid = i0;
  267. //log(" 档案列表回溯:%s:%d n", id, auth);
  268. if( auth != 0 ){
  269. char data[100];
  270. snprintf( data, sizeof( data ) , "%d" , auth );
  271. saacproto_ACCharList_send( ti , FAILED , data , mesgid );
  272. total_ng_charlist++;
  273. return;
  274. }
  275. // 取消下列 unlock 动作
  276.     if( isLocked( id ) ){
  277. saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid );
  278. checkGSUCheck( id );
  279. total_ng_charlist++;
  280. return;
  281.     }
  282. #ifdef _SLEEP_CHAR // 如果无新档, 将旧档移至新档
  283. {
  284. char fn_old[256], fn_new[256];
  285. FILE *fp_old, *fp_new;
  286. int i;
  287. // 移人物档
  288. for( i=0; i<MAXCHAR_PER_USER; i++) {
  289. makeCharFileName( id, fn_new, sizeof(fn_new), i);
  290. fp_new = fopen( fn_new, "r");
  291. if( fp_new == NULL ) {
  292. makeSleepCharFileName( id, fn_old, sizeof(fn_old), i);
  293. fp_old = fopen( fn_old, "r");
  294. if( fp_old != NULL ) {
  295. fclose( fp_old);
  296. rename( fn_old, fn_new); // 搬移
  297. //filecopy( fn_old, fn_new); // 复制
  298. log(" 移档_%s ", fn_new);
  299. }
  300. }
  301. else {
  302. fclose( fp_new);
  303. }
  304. }
  305. // 移仓物品库档
  306. makeCharPoolItemFileName( id, fn_new, sizeof(fn_new));
  307. fp_new = fopen( fn_new, "r");
  308. if( fp_new == NULL ) {
  309. makeSleepCharPoolItemFileName( id, fn_old, sizeof(fn_old));
  310. fp_old = fopen( fn_old, "r");
  311. if( fp_old != NULL ) {
  312. fclose( fp_old);
  313. rename( fn_old, fn_new); // 搬移
  314. //filecopy( fn_old, fn_new); // 复制
  315. log(" 移档_%s ", fn_new);
  316. }
  317. }
  318. else {
  319. fclose( fp_new);
  320. }
  321. // 移仓宠物库档
  322. makeCharPoolPetFileName( id, fn_new, sizeof(fn_new));
  323. fp_new = fopen( fn_new, "r");
  324. if( fp_new == NULL ) {
  325. makeSleepCharPoolPetFileName( id, fn_old, sizeof(fn_old));
  326. fp_old = fopen( fn_old, "r");
  327. if( fp_old != NULL ) {
  328. fclose( fp_old);
  329. rename( fn_old, fn_new); // 搬移
  330. //filecopy( fn_old, fn_new); // 复制
  331. log(" 移档_%s ", fn_new);
  332. }
  333. }
  334. else {
  335. fclose( fp_new);
  336. }
  337. }
  338. #endif
  339.     loadCharNameAndOption( id , listbuf,sizeof(listbuf));
  340.     // Arminius
  341.     saacproto_ACCharList_send( ti ,  SUCCESSFUL , listbuf , mesgid);
  342.     total_ok_charlist++;
  343. }
  344. void charDeleteCallback( int ti , int auth ,
  345. char *c0 , char *c1 , char *c2 , char *c3 ,
  346. char *c4 , int i0 , int i1 )
  347. {
  348. int charindex;
  349. char *id = c0;
  350. char *charname = c2;
  351. int mesgid = i0;
  352. struct tm *now;
  353. time_t timenow;
  354. char logfile[128];
  355. if( auth != 0 ){
  356. char data[100];
  357. snprintf( data, sizeof( data ) , "%d" , auth );
  358. saacproto_ACCharDelete_send( ti , FAILED , data, mesgid );
  359. return;
  360. }        
  361. charindex = getCharIndexByName( id , charname );
  362. if( charindex < 0 ){
  363. saacproto_ACCharDelete_send( ti , FAILED , "nochar",  mesgid );
  364. return;
  365. }   
  366. if( unlinkCharFile( id , charindex ) < 0 ){
  367. saacproto_ACCharDelete_send( ti , FAILED , "fileI/O" , mesgid);
  368. return;
  369. }
  370. #ifdef _FAMILY
  371. // CoolFish: Family 2001/6/12
  372. {
  373. int index = 0, fmindex = 0, fmcharindex = 0;
  374. char fmname[32];
  375. index = ACgetFMInfoFromChar(fmname, &fmindex, charname, id, &fmcharindex);
  376. if (index != -1)
  377. {
  378. if (fmcharindex == 0)
  379. {
  380. #ifdef _FMVER21
  381. if (ChangeFMLeader(index, fmname, fmindex) >= 0)
  382. {
  383. if (ACDelFM(index, fmname, fmindex) >= 0)
  384. log("删除家族成员:%d 家族名:%s 家族索引:%d 人物:%s, 账号:%s, 家族人物索引:%dn",
  385. index, fmname, fmindex, charname, id, fmcharindex);
  386. }
  387. log("ChangeFMLeader_3 index:%d fmname:%s fmindex:%dn", index, fmname, fmindex);
  388. #else
  389. if (ACDelFM(index, fmname, fmindex) >= 0)
  390. log("删除家族成员:%d 家族名:%s 家族索引:%d 人物:%s, 账号:%s, 家族人物索引:%dn",
  391. index, fmname, fmindex, charname, id, fmcharindex);
  392. #endif
  393. }
  394. else 
  395. {
  396. #ifdef _FMVER21
  397. if (ACMemberLeaveFM(index, fmname, fmindex, charname, 0, 0, fmcharindex) >= 0)
  398. log("ACMemberLeaveFM index:%d 家族名:%s 家族索引:%d 人物:%s, 账号:%s, 家族人物索引:%dn",
  399. index, fmname, fmindex, charname, id, fmcharindex);
  400. #else
  401. if (ACMemberLeaveFM(index, fmname, fmindex, charname, 0, fmcharindex) >= 0)
  402. log("ACMemberLeaveFM index:%d 家族名:%s 家族索引:%d 人物:%s, 账号:%s, 家族人物索引:%dn",
  403. index, fmname, fmindex, charname, id, fmcharindex);
  404. #endif
  405. }
  406. }
  407. }
  408. #endif    
  409. // Spock 2000/12/6
  410. time( &timenow );
  411. now = localtime( &timenow );
  412. sprintf( logfile , "log/chardel/%04d%02d%02d.log" ,
  413. now->tm_year + 1900 , now->tm_mon + 1 , now->tm_mday );
  414. LOGBASE( logfile , "%04d/%02d/%02d %02d:%02d:%02d id:[%s] char:[%s] index:[%d]n" ,
  415. now->tm_year + 1900 , now->tm_mon + 1 , now->tm_mday ,
  416. now->tm_hour , now->tm_min , now->tm_sec ,
  417. id , charname , charindex );
  418. // Spock end
  419. USERLOG( id , "账号删除: 成功n" );
  420. saacproto_ACCharDelete_send( ti ,  SUCCESSFUL , "ok" , mesgid);
  421. }
  422. void dummyCallback( int ti , int auth ,
  423.  char *c0 , char *c1 , char *c2 , char *c3 ,
  424.  char *c4 , int i0 , int i1 )
  425. {
  426. return;
  427. }
  428. static void getCharNameFromString(char *str ,char *out )
  429. {
  430. int c;
  431. out[0]='';
  432. for(c=0;;c++){
  433. if( IS_2BYTEWORD( str[c] ) ){
  434. out[c] = str[c];
  435. c ++ ; // 戚及  侬尺
  436. out[c] = str[c];
  437. continue;
  438. }
  439. out[c] = str[c];
  440. if( str[c] == '' )break;
  441. if( str[c] == SPACE ){
  442. out[c] = '';
  443. break;
  444. }
  445. }
  446. }
  447. static void getCharOptionFromString( char *str , char *out )
  448. {
  449. int c;
  450. int outc = 0;
  451. out[outc] = '';
  452. for(c=0;;c++){
  453. if( str[c]=='')break;
  454. if( IS_2BYTEWORD( str[c] ) ){
  455. c++;
  456. if( str[c] == '' )break; // 公及  侬互允匹卞NULL卅日蔽  
  457. continue;
  458. }
  459. if( str[c]== SPACE ){
  460. c++;
  461. for(;;c++){
  462. if( str[c] == '' ){ // 蔽  分匀凶日 NULL   木化蔽歹月
  463. out[outc] = '';
  464. break;
  465. }
  466. // 仇仇手ㄡ田奶玄  侬及ㄠ田奶玄  卅日手丹域田奶玄戊疋□允月
  467. //----   For 2Byte Code ----
  468. if( IS_2BYTEWORD( str[c] ) ){
  469. out[outc++] = str[c++]; // ㄠ田奶玄  戊疋□
  470. out[outc++] = str[c]; // ㄡ田奶玄  戊疋□
  471. if( str[c] == '' )break; // 公及  侬互允匹卞NULL卅日蔽  
  472. continue;
  473. }
  474. // 骚橘  侬反ㄠ田奶玄戊疋□
  475. out[outc] = str[c]; // 引内戊疋□
  476. if( str[c] == '' )break; // 蔽  分匀凶日蔽歹月
  477. if( str[c] == SPACE ){
  478. out[outc] = '';
  479. break;
  480. }
  481. outc++;
  482. }
  483. return;
  484. }
  485. }
  486. }
  487. void getCharInfoFromString( char *str , char *out )
  488. {
  489. int c=0,outc=0;
  490. int space_counter=0;
  491. out[outc] = '';
  492. for(c=0;;c++){
  493. if( str[c]=='')break;
  494. if( IS_2BYTEWORD( str[c] ) ){
  495. c++;
  496. continue;
  497. }else
  498. if( str[c]== SPACE ){
  499. space_counter++;
  500. }
  501. if( space_counter==2 && str[c]== SPACE ){
  502. c++;
  503. for(;;c++){
  504. if( IS_2BYTEWORD( str[c] ) ){
  505. out[outc++] = str[c++];
  506. out[outc++] = str[c];
  507. if( str[c] == '' ){
  508. out[outc] = '';
  509. break;
  510. }
  511. continue;
  512. }
  513. out[outc] = str[c];
  514. if( str[c] == '' )break;
  515. if( str[c] == SPACE ){
  516. out[outc] = '';
  517. break;
  518. }
  519. outc++;
  520. }
  521. return;
  522. }
  523. }
  524. }
  525. static void makeCharFileName( char *id,char *output, int outlen, int num)
  526. {
  527. char body[1024];
  528. if ( strlen( id) < 1)return;
  529. snprintf(body , sizeof(body ) , "%s.%d.char" , id , num );
  530. makeDirFilename(output , outlen, chardir , getHash(id) ,body);
  531. }
  532. #ifdef _SLEEP_CHAR // 取得非活跃人物档名
  533. static void makeSleepCharFileName( char *id,char *output, int outlen, int num)
  534. {
  535. char body[1024];
  536. if ( strlen( id) < 1)return;
  537. snprintf(body , sizeof(body ) , "%s.%d.char" , id , num );
  538. makeDirFilename(output , outlen, sleepchardir , getHash(id) ,body);
  539. }
  540. #endif
  541. int loadCharNameAndOption( char *id , char *output , int outlen)
  542. {
  543. char chbuf[MAXCHAR_PER_USER][CHARDATASIZE];
  544. char namework[CHARDATASIZE];
  545. char optionwork[CHARDATASIZE];
  546. char nm_work[CHARDATASIZE];
  547. int i,count=0;
  548. int so_far_bytes = 0;
  549. output[0] = 0;
  550. for(i=0;i<MAXCHAR_PER_USER;i++){
  551. int l;
  552. char delim[2];
  553. chbuf[i][0] = 0;
  554. loadCharOne( id , i , chbuf[i] , sizeof( chbuf[i] ));
  555. getCharNameFromString( chbuf[i] , namework );
  556. getCharOptionFromString( chbuf[i] , optionwork );
  557. if( chbuf[i][0] == 0 )continue;
  558. if( strlen( output ) > 0 ){
  559. delim[0] = SPACE;
  560. delim[1] = 0;
  561. } else {
  562. delim[0] = 0;
  563. }
  564. snprintf( nm_work , sizeof( nm_work ),
  565. "%s%s|%s" , delim,namework , optionwork );
  566. l = strlen( nm_work );
  567. if( ( so_far_bytes + l ) < outlen ){
  568. strcat( output , nm_work );
  569. so_far_bytes += l;
  570. count++;
  571. }
  572. }
  573. return count;
  574. }
  575. int loadCharOne( char *id , int num, char *output , int outlen )
  576. {
  577. char fn[1024];
  578. FILE *fp;
  579. char c_temp,*c_ptr;
  580. c_ptr=output;
  581. makeCharFileName( id , fn , sizeof(fn),num );    
  582. fp  = fopen( fn , "r" );
  583. if( fp == NULL ){
  584. return -1;
  585. }
  586. do{
  587. c_temp = fgetc(fp);
  588. *c_ptr=c_temp;
  589. c_ptr++;
  590. }while(c_temp != EOF);
  591. *c_ptr='';
  592. if( output[0]=='|' && output[1]=='|' ){
  593. return -1;
  594. }
  595. fclose(fp);
  596. return 0;
  597. }
  598. int saveCharOne( char *id , int num , char *input )
  599. {
  600. char fn[1024];
  601. FILE *fp;
  602. char *strp;
  603. char *strp1;     // Won 修正 hp 为负的人
  604. makeCharFileName( id , fn , sizeof(fn),num );
  605. fp= fopen( fn , "w" );
  606. if( fp == NULL ) {
  607. log( "save error 01: %d",errno );//Change add errno
  608. return -1;
  609. }
  610. // Won 修正 hp 为负的人
  611. if ((strp=strstr(input,"\nhp=-"))!=NULL) {
  612. strp1=strstr(input,"\nmp="); 
  613. *(strp+5)='1';
  614. strcpy((strp+6), strp1);  
  615. }
  616. // Arminius
  617. if ((strp=strstr(input,"\nhp=0\n"))!=NULL) *(strp+5)='1';
  618. fprintf( fp , "%s" , input );
  619. fclose(fp);
  620. log( "写入 %s 档案文件:%sn",id , fn );
  621. chmod(fn,0777);
  622. return 0;
  623. }
  624. static int makeSaveCharString( char *out , int outlen ,
  625. char *nm , char *opt , char *info )
  626. {
  627. char nmwork[CHARDATASIZE];
  628. char optwork[CHARDATASIZE];
  629. char infowork[CHARDATASIZE];
  630. char outwork[CHARDATASIZE];
  631. char *nmwork_p , *optwork_p , *infowork_p;
  632. int l;
  633. /* 戊疋□仄化 */
  634. strncpy( nmwork , nm , sizeof( nmwork ));
  635. nmwork[strlen( nm)]=0;
  636. strncpy( optwork , opt , sizeof( optwork ));
  637. optwork[strlen(opt)]=0;
  638. strncpy( infowork , info , sizeof( infowork ));
  639. infowork[strlen(info)]=0;
  640. /* 巨旦弗□皿仄 */
  641. /*    if ( esc ) {
  642. nmwork_p = makeEscapeString1( nm , nmwork ,sizeof( nmwork ));
  643. optwork_p = makeEscapeString1( opt , optwork , sizeof( optwork ));
  644. infowork_p = makeEscapeString1( info , infowork , sizeof( infowork ));
  645. } else {*/
  646. nmwork_p = makeEscapeString( nm , nmwork ,sizeof( nmwork ));
  647. optwork_p = makeEscapeString( opt , optwork , sizeof( optwork ));
  648. infowork_p = makeEscapeString( info , infowork , sizeof( infowork ));
  649. //    }
  650. /* 勾卅仆月[赞中互巨仿□腹请及凶户卞域荚伐□弁卞中木月[ */
  651. snprintf( outwork ,sizeof( outwork ) ,
  652. "%s" SPACESTRING "%s" SPACESTRING "%s" ,
  653. nmwork_p , optwork_p , infowork_p );
  654. l = strlen( outwork );
  655. if( l >= (outlen-1)){
  656. return -1;
  657. }
  658. /* NULL   侬互    卞丐月井日0毛中木氏午中井氏及分[ */
  659. memcpy( out , outwork , l + 1);
  660. return 0;
  661. }
  662. int getCharIndexByName( char *id , char *charname )
  663. {
  664. int i;
  665. for(i=0;i<MAXCHAR_PER_USER;i++){
  666. char output[CHARDATASIZE];
  667. if( loadCharOne( id , i , output , sizeof( output )) < 0 ){
  668. /* 丐中化中月″ */
  669. continue;
  670. } else {
  671. /* 平乓仿互绣箕仄凶 */
  672. char cn[CHARDATASIZE];
  673. getCharNameFromString( output , cn );
  674. /* Escape毛荸仁 */
  675. if( strcmp( charname , makeStringFromEscaped(cn) ) == 0 ){
  676. return i;
  677. }else{
  678. }
  679. }
  680. }
  681. return -1;
  682. }
  683. /*
  684.   平乓仿及丐中化中月旦夫永玄毛腹绸允月
  685.   卅日丐中化中卅中[0动晓卅日丐五旦夫永玄及index.
  686. 签卞夫□玉匹五卅井匀凶日公木毛井尹允分仃[
  687. 手匀午切扎氏午匹五月支欠仃升手[
  688. */
  689. static int findBlankCharIndex( char *id  )
  690. {
  691. int i;
  692. char output[CHARDATASIZE];
  693. for(i=0;i<MAXCHAR_PER_USER;i++){
  694. if( loadCharOne( id , i , output , sizeof( output ) ) < 0 ){
  695. return i;
  696. }
  697. }
  698. return -1;
  699. }
  700. static int unlinkCharFile( char *id , int num )
  701. {
  702. char fname[1024];
  703. #ifdef _SLEEP_CHAR //删除人物时旧档也删
  704. makeSleepCharFileName( id, fname, sizeof(fname),num );
  705. unlink( fname );
  706. #endif
  707. makeCharFileName( id, fname, sizeof(fname),num );
  708. return unlink( fname );
  709. }
  710. #ifdef _LOCK_ADD_NAME
  711. int lockUser(  char *gmsvname , char *id , char *name, char *passwd , int lock , 
  712.  char *result, int resultlen,
  713.  char *retdata , int retdatalen , char *process , char *deadline)
  714. #else
  715. int lockUser(  char *gmsvname , char *id , char *passwd , int lock , 
  716.  char *result, int resultlen,
  717.  char *retdata , int retdatalen , char *process , char *deadline)
  718. #endif
  719. {
  720. char fname[1024];
  721. int ret = -1;
  722. if(!id[0]){
  723. snprintf(result , resultlen , FAILED);
  724. snprintf(retdata , retdatalen , "bad id");
  725. return -1;
  726. }
  727. retdata[0] = 0;
  728. if( lock ){
  729. if (isLocked(id)) {
  730. snprintf( result , resultlen, FAILED );
  731. snprintf( retdata , retdatalen, "already locked" );
  732. log( "写入内存信息: 用户:%x/%s 已经同意锁定 !!n", getHash(id), id);
  733. return -1;
  734. } else {
  735. #ifdef _LOCK_ADD_NAME
  736. if( InsertMemLock( getHash(id) & 0xff, id, name, passwd, gmsvname, atoi(process), deadline ) )
  737. #else
  738. if( InsertMemLock( getHash(id) & 0xff, id, passwd, gmsvname, atoi(process), deadline ) )
  739. #endif
  740. return 0;
  741. else
  742. return -1;
  743. }
  744. } else {
  745. if( !isLocked( id) ) {
  746. log( "删除内存信息: 用户:%x/%s 没有锁定!!n", getHash(id), id);
  747. }
  748. if( DeleteMemLock( getHash(id) & 0xff, id, &ret) ) {
  749. snprintf( result , resultlen, SUCCESSFUL );
  750. snprintf( retdata , retdatalen, "removed" );
  751. return ret;
  752. } else {
  753. snprintf( result , resultlen, FAILED );
  754. snprintf( retdata , retdatalen, "不能移除锁定" );
  755. log( "不能解锁 %x:%s !n", getHash(id), id);
  756. return ret;
  757. }
  758. }
  759. }
  760. int isLocked( char *id )
  761. {
  762. if (!id[0]) return 1; // invalid id: lock it
  763. return isMemLocked(getHash(id) & 0xff, id);
  764. }
  765. int checkValidCharName( char *a)
  766. {
  767. int i;
  768. for(i=0;;i++){
  769. if( a[i] == 0 )break;
  770. if( a[i] == SPACE )return -1;
  771. }
  772. return 0;
  773. }
  774. #ifdef _CHAR_POOLITEM
  775. static void makeCharPoolItemFileName( char *id,char *output, int outlen)
  776. {
  777. char poolitem[256];
  778. if ( strlen( id) < 1)return;
  779. snprintf( poolitem , sizeof( poolitem ) , "%s.item" , id);
  780. makeDirFilename(output , outlen, chardir , getHash(id) ,poolitem);
  781. }
  782. #ifdef _SLEEP_CHAR // 取得非活跃人物仓库档名
  783. static void makeSleepCharPoolItemFileName( char *id,char *output, int outlen)
  784. {
  785. char poolitem[256];
  786. if ( strlen( id) < 1)return;
  787. snprintf( poolitem , sizeof( poolitem ) , "%s.item" , id);
  788. makeDirFilename(output , outlen, sleepchardir , getHash(id) ,poolitem);
  789. }
  790. #endif
  791. int InsertCharPoolItem( char *id , char *input, int sizes)
  792. {
  793. char fn[256];
  794. FILE *fp;
  795. if( sizes <= 0 ) return sizes;
  796. makeCharPoolItemFileName( id , fn , sizeof(fn));
  797. fp= fopen( fn , "a+" );
  798. if( fp == NULL ) {
  799. fp= fopen( fn , "w" );
  800. if( fp == NULL ) {
  801. log( "保存 %s 错误.n", fn);
  802. return -1;
  803. }
  804. }
  805. fprintf( fp , "%s" , input );
  806. fclose(fp);
  807. log( "添加 %s 物品仓库文件:%sn", id , fn );
  808. return sizes;
  809. }
  810. int saveCharPoolItem( char *id , char *input, int sizes)
  811. {
  812. char fn[256];
  813. FILE *fp;
  814. if( sizes < 0 ) return sizes;
  815. if( input == NULL ) return -1;
  816. makeCharPoolItemFileName( id , fn , sizeof(fn));
  817. fp= fopen( fn , "w" );
  818. if( fp == NULL ) {
  819. log( "保存 %s 错误.n", fn);
  820. return -1;
  821. }
  822. fprintf( fp , "%s" , input );
  823. fclose(fp);
  824. log( "写入 %s 道具档案文件:%sn", id , fn );
  825. return sizes;
  826. }
  827. int loadCharPoolItemOne( char *id , char *output , int outlen)
  828. {
  829. char fn[256];
  830. FILE *fp;
  831.   char c_temp,*c_ptr;
  832. int sizes=0;
  833. c_ptr=output;
  834. makeCharPoolItemFileName( id , fn , sizeof(fn));
  835. fp  = fopen( fn , "r" );
  836. if( fp == NULL ){
  837. if( (fp = fopen( fn , "w" )) == NULL)
  838. return -1;
  839. return 0;
  840. }
  841. do{
  842. c_temp = fgetc(fp);
  843. *c_ptr=c_temp;
  844. c_ptr++;
  845.    sizes++;
  846.  if( sizes >= (outlen-1) ) break;
  847. }while(c_temp != EOF);
  848. *c_ptr='';
  849. fclose(fp);
  850. return sizes;
  851. }
  852. int checkCharPoolItem( char *id)
  853. {
  854. char fn[256];
  855. FILE *fp;
  856. makeCharPoolItemFileName( id , fn , sizeof(fn));
  857. fp = fopen( fn , "r" );
  858. if( fp == NULL ) {
  859. if( saveCharPoolItem( id , "", 0) < 0 ){
  860. log("n 无法建立档案:%s 物品仓库文件!!", id);
  861. return -1;
  862. }
  863. }else{
  864. fclose(fp);
  865. }
  866. return 1;
  867. }
  868. #endif
  869. #ifdef _CHAR_POOLPET
  870. static void makeCharPoolPetFileName( char *id,char *output, int outlen)
  871. {
  872. char poolpet[256];
  873. if ( strlen( id) < 1)return;
  874. snprintf( poolpet , sizeof( poolpet ) , "%s.pet" , id);
  875. makeDirFilename(output , outlen, chardir , getHash(id) ,poolpet);
  876. }
  877. #ifdef _SLEEP_CHAR // 取得非活跃人物仓库档名
  878. static void makeSleepCharPoolPetFileName( char *id,char *output, int outlen)
  879. {
  880. char poolpet[256];
  881. if ( strlen( id) < 1)return;
  882. snprintf( poolpet , sizeof( poolpet ) , "%s.pet" , id);
  883. makeDirFilename(output , outlen, sleepchardir , getHash(id) ,poolpet);
  884. }
  885. #endif
  886. int InsertCharPoolPet( char *id , char *input, int sizes)
  887. {
  888. char fn[256];
  889. FILE *fp;
  890. if( sizes <= 0 ) return sizes;
  891. makeCharPoolPetFileName( id , fn , sizeof(fn));
  892. fp= fopen( fn , "a+" );
  893. if( fp == NULL ) {
  894. fp= fopen( fn , "w" );
  895. if( fp == NULL ) {
  896. log( "保存 %s 错误.n", fn);
  897. return -1;
  898. }
  899. }
  900. fprintf( fp , "%s" , input );
  901. fclose(fp);
  902. log( "添加 %s 宠物仓库文件:%sn", id , fn );
  903. return sizes;
  904. }
  905. int saveCharPoolPet( char *id , char *input, int sizes)
  906. {
  907. char fn[256];
  908. FILE *fp;
  909. if( sizes < 0 ) return sizes;
  910. if( input == NULL ) return -1;
  911. makeCharPoolPetFileName( id , fn , sizeof(fn));
  912. fp= fopen( fn , "w" );
  913. if( fp == NULL ) {
  914. log( "保存 %s 错误.n", fn);
  915. return -1;
  916. }
  917. fprintf( fp , "%s" , input );
  918. fclose(fp);
  919. log( "写入 %s 宠物档案文件:%sn", id , fn );
  920. return sizes;
  921. }
  922. int loadCharPoolPetOne( char *id , char *output , int outlen)
  923. {
  924. char fn[256];
  925. FILE *fp;
  926. char c_temp,*c_ptr;
  927. int sizes=0;
  928. c_ptr=output;
  929. makeCharPoolPetFileName( id , fn , sizeof(fn));
  930. fp  = fopen( fn , "r" );
  931. if( fp == NULL ){
  932. if( (fp = fopen( fn , "w" )) == NULL)
  933. return -1;
  934. return 0;
  935. }
  936. do{
  937. c_temp = fgetc(fp);
  938. *c_ptr=c_temp;
  939. c_ptr++;
  940.    sizes++;
  941.  if( sizes >= (outlen-1) ) break;
  942. }while(c_temp != EOF);
  943. *c_ptr='';
  944. fclose(fp);
  945. return sizes;
  946. }
  947. int checkCharPoolPet( char *id)
  948. {
  949. char fn[256];
  950. FILE *fp;
  951. makeCharPoolPetFileName( id , fn , sizeof(fn));
  952. fp = fopen( fn , "r" );
  953. if( fp == NULL ) {
  954. if( saveCharPoolPet( id , "", 0) < 0 ){
  955. log("n 无法建立档案:%s 宠物仓库文件!!", id);
  956. return -1;
  957. }
  958. }else{
  959. fclose(fp);
  960. }
  961. return 1;
  962. }
  963. #endif
  964. int filecopy( char *oldfilename, char *newfilename)
  965. {
  966. FILE *oldfile;
  967. FILE *newfile;
  968. char c_temp;
  969. if( (oldfile = fopen( oldfilename, "r") ) == NULL ) {
  970. return -1;
  971. }
  972. if( (newfile = fopen( newfilename, "w") ) == NULL ) {
  973. return -1;
  974. }
  975. while(1) {
  976. c_temp = fgetc( oldfile);
  977. if( c_temp == EOF)
  978. break;
  979. fputc( c_temp, newfile);
  980. };
  981. fclose( oldfile);
  982. fclose( newfile);
  983. return 0;
  984. }