OK論壇

 找回密碼
 註冊
查看: 2922|回復: 6

[分享] 【已測】仿sea的cmd系統...

[複製鏈接]
  • TA的每日心情
    慵懶
    2013-7-11 12:09 AM
  • 簽到天數: 118 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-31 18:52:46 | 顯示全部樓層 |閱讀模式
    本帖最後由 Alopex 於 2011-9-6 07:50 PM 編輯

    已測結束,感謝sinya,rgrg1234


    atcommand.c


    add:
    1. #define MAX_CMD 100 //Default the limit of cmd.



    2. struct Command {
    3.         char cmd_name[100];  //The length of name.
    4.         int gm_lv;
    5.         int char_lv;
    6.         int cmd_para_num;
    7.         struct script_code *cmd_script;
    8. };

    9. static struct Command *cmd_db[MAX_CMD];//To be a point.
    10. static int cmd_num = 0;

    11. void do_init_command(const char *filename);

    12. void do_init_command(const char *filename){
    13.         FILE* fp;
    14.         int line_num = 0,read_cmd_num = 0;
    15.         char line[1024];
    16.         if((fp = fopen(filename, "r")) == NULL )
    17.         {
    18.                 ShowWarning("do_init_command: File "%s" does not exist.\n ",filename);
    19.                 return;
    20.         }
    21.         memset(cmd_db, 0, sizeof(cmd_db)); //Init cmd_db.
    22.         while(fgets(line, sizeof(line), fp) && ++line_num)
    23.         {
    24.                 int i;
    25.                 char *str[5], *p;
    26.                 struct Command *cmd;

    27.                 CREATE(cmd, struct Command, 1);
    28.                 memset(str, 0, sizeof(str));
    29.                
    30.                 p = line;

    31.                 while(ISSPACE(*p))p++;//skip space.

    32.                 if(*p == '/' && *(p+1) == '/')
    33.                         continue; // skip "//"

    34.                 if(*p == '\0')
    35.                         continue; // The ending of line.

    36.                 for(i = 0 ; i < 5 ; i++)
    37.                 {
    38.                         str[i] = p;
    39.                         p = strchr(p, ',');
    40.                         if(p == NULL||i==4) break;
    41.                         *p = '\0'; // Exchange ',' for '\0';
    42.                         p++;
    43.                 }
    44.                 if(get_atcommandinfo_byname(str[0]) == NULL || str[0] == NULL)// check repeated cmd.
    45.                 {
    46.                         safestrncpy(cmd->cmd_name, str[0], sizeof(cmd->cmd_name));
    47.                         cmd->gm_lv = atoi(str[1]);
    48.                         cmd->char_lv = atoi(str[2]);
    49.                         cmd->cmd_para_num = atoi(str[3]);
    50.                         cmd->cmd_script = parse_script(str[4], filename ,line_num ,0);
    51.                         if(cmd->cmd_script)
    52.                         {
    53.                                 cmd_db[read_cmd_num] = cmd;
    54.                                 read_cmd_num++;
    55.                                 //ShowStatus("Do_init_command: Loaded Command: %s , Number : %d. \n",cmd->cmd_name,read_cmd_num);
    56.                         }else
    57.                                 aFree(cmd);
    58.                 }else
    59.                         aFree(cmd);
    60.         }
    61.         cmd_num = read_cmd_num;
    62.         fclose(fp);
    63.         ShowStatus("Do_init_command: Complete ! Total %lu defined in %s . \n",cmd_num,filename);
    64.         return;
    65. }
    複製代碼
    Looking for:
    1.         info = get_atcommandinfo_byname(command);
    複製代碼
    add:
    1.         if(info == NULL){
    2.                 int cmd_id;
    3.                 struct Command *cmd_info;
    4.                 char* name = (char*)command;
    5.                 if( *name == atcommand_symbol || *name == charcommand_symbol ) name++;
    6.                 ARR_FIND( 0, cmd_num, cmd_id, strcmpi(cmd_db[cmd_id]->cmd_name, name) == 0 );//looking for name in cmd_db;
    7.                 cmd_info = ((cmd_id > cmd_num) ? NULL : cmd_db[cmd_id]);
    8.         
    9.                 if(cmd_info == NULL || (type && ((*atcmd_msg == atcommand_symbol && pc_isGM(sd) < cmd_info->gm_lv) || (*atcmd_msg == charcommand_symbol && pc_isGM(sd) < cmd_info->char_lv))))
    10.                 {
    11.                         sprintf(output, msg_txt(153), command); // "%s is Unknown Command."
    12.                         clif_displaymessage(fd, output);
    13.                         return true;
    14.                 }
    15.         
    16.                 {
    17.                         int i;
    18.                         char *str = params;
    19.                         char *split,para_data[100];
    20.                         struct map_session_data *target = (*atcmd_msg==atcommand_symbol) ? sd : ssd;
    21.                         script_cleararray_pc(target, "@cmd_para$" ,(void*)0);//clear @cmd_para$.
    22.                         for(i = 0 ; i < cmd_info->cmd_para_num && i < 128 ; i++)
    23.                         {
    24.                                 split = strchr(str ,' ');
    25.                                 if(split == NULL)//To avoid empty data.
    26.                                 {
    27.                                         script_setarray_pc(target,"@cmd_para$", i , (void*)str , (int*)0);
    28.                                         break;
    29.                                 }
    30.                                 *split = '\0';
    31.                                 safestrncpy(para_data, str, sizeof(para_data));
    32.                                 script_setarray_pc(target,"@cmd_para$", i , (void*)para_data , (int*)0);
    33.                                 str = ++split;
    34.                         }
    35.                         run_script(cmd_info->cmd_script,0,target->bl.id,0);
    36.                 }
    37.                 return true;
    38.         }
    複製代碼
    map.c

    looking for:
    1. do_init_duel();
    複製代碼
    add:
    1. do_init_command("db/cmd_db.txt");
    複製代碼
    db底下建cmd_db.txt


    內容:
    1. //格式:
    2. //<玩家指令>,<@指令等級>,<#指令等級>,<參數數量>,{腳本}
    3. // @cmd_para$[]為參數,不超過127
    4. // 數字參數請使用atoi(@cmd_para$[])


    5. testcommand,10,20,1,{mes "看到訊息表示成功!"+@cmd_para$[0];close;}

    複製代碼

    評分

    參與人數 2積分 +55 現金 +50 積極性 +50 收起 理由
    勳〃 + 50 + 50 + 50 精品文章
    sinya + 5 這個太棒了

    查看全部評分

    回復

    使用道具 舉報

  • TA的每日心情
    開心
    5 天前
  • 簽到天數: 1323 天

    連續簽到: 1 天

    [LV.10]以壇為家III

    發表於 2011-7-31 20:50:14 | 顯示全部樓層
    本帖最後由 sinya 於 2011-8-1 01:17 AM 編輯

    我測式成功 執行 對話窗 @ 和 # 都正常運作


    this is just amazing awesome!!

    可惜 我只能加5分 不然我給你加 99999999
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2012-10-20 12:31 AM
  • 簽到天數: 305 天

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-7-31 22:09:48 | 顯示全部樓層
    成功加一
    這真的很nice
    pretty good!
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    慵懶
    2017-2-15 05:18 PM
  • 簽到天數: 476 天

    連續簽到: 1 天

    [LV.9]以壇為家II

    發表於 2011-8-1 11:48:51 | 顯示全部樓層
    U R pretty good..

    嘛 其&#23454;&#21442;&#25968;&#25968;量&#36825;&#20010;&#19996;西 我也不是&#35273;得太有用`.

    把@ 和#的等&#32423; 弄成atcmd.conf 控制就好了= =~.
    &#35843;整下加&#36733;&#39034;序- -~.
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2012-10-20 12:31 AM
  • 簽到天數: 305 天

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-8-1 20:38:34 | 顯示全部樓層
    加上了個可以直接重讀db的
    用起來更方便=.=+
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    擦汗
    2014-8-13 07:23 AM
  • 簽到天數: 109 天

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-9-6 12:51:35 | 顯示全部樓層
    回復 1# Alopex

    :91:
    這代碼真棒呢!

    感謝分享了。
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    慵懶
    2013-7-11 12:09 AM
  • 簽到天數: 118 天

    連續簽到: 1 天

    [LV.6]常住居民II

     樓主| 發表於 2011-9-6 19:51:51 | 顯示全部樓層
    修正部份bug...只輸入一個參數將無法正確達成
    回復 支持 反對

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 註冊

    本版積分規則

    Archiver|手機版|小黑屋|OK討論區

    GMT+8, 2024-5-7 04:07 AM , Processed in 0.137101 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回復 返回頂部 返回列表