OK論壇

 找回密碼
 註冊
查看: 3742|回復: 13

[分享] 路點系統 8/29優化完畢.

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-8-28 20:02:33 | 顯示全部樓層 |閱讀模式
    本帖最後由 Alopex 於 2011-8-29 03:56 PM 編輯

    已測試,副作用不知道...

    map.h

    add
    1. #define MAX_WAYPOINT 100

    2. struct Waypoint{
    3.         int x[MAX_WAYPOINT];
    4.         int y[MAX_WAYPOINT];
    5.         int num;
    6. }waypoint[MAX_WAYPOINT];
    複製代碼
    map.c
    add
    1. void Do_Init_Waypoint(const char *filename);

    2. void Do_Init_Waypoint(const char *filename){
    3.         FILE* fp;
    4.         int line_num = 0,read_waypoint_num = 0;
    5.         char line[1024];
    6.         if((fp = fopen(filename, "r")) == NULL )
    7.         {
    8.                 ShowWarning("Do_Init_Waypoint: File "%s" does not exist.\n ",filename);
    9.                 return;
    10.         }
    11.         while(fgets(line, sizeof(line), fp) && ++line_num && read_waypoint_num < MAX_WAYPOINT)
    12.         {
    13.                 int i;
    14.                 char *str[2],*p = line;
    15.                 while(ISSPACE(*p))p++;//skip space.
    16.                 if(*p == '/' && *(p+1) == '/')
    17.                         continue; // skip "//"
    18.                 for(i=0 ; i < 100 ;i++){
    19.                         str[0] = p;
    20.                         p = strchr(p, ',');
    21.                         if(p == NULL){
    22.                                 waypoint[read_waypoint_num].num = 0;
    23.                                 break;
    24.                         }
    25.                         *p = '\0';
    26.                         p++;
    27.                         str[1] = p;
    28.                         p = strchr(p, ',');
    29.                         waypoint[read_waypoint_num].x[i] = atoi(str[0]);
    30.                         waypoint[read_waypoint_num].y[i] = atoi(str[1]);
    31.                         waypoint[read_waypoint_num].num++;
    32.                         if(p == NULL){
    33.                                 read_waypoint_num++;
    34.                                 break;
    35.                         }
    36.                         *p = '\0';
    37.                         p++;
    38.                 }
    39.         }
    40. }
    複製代碼
    find:
    1. do_init_battle();
    複製代碼
    上方增加
    1. Do_Init_Waypoint("db/waypoint.txt");
    複製代碼
    script.c

    add
    1. BUILDIN_FUNC(setwaypoint)
    2. {
    3.         TBL_MOB *bl;
    4.         int way_point ;
    5.         bl = (TBL_MOB*)map_id2bl(script_getnum(st,2));        way_point = script_getnum(st,3);
    6.         if( bl == NULL || way_point >= 100)        {
    7.                 script_pushint(st, 0);
    8.                 return 0;
    9.         }
    10.         bl->self_waypoint = &waypoint[way_point];
    11.         bl->waypoint_move = 0;
    12.         script_pushint(st, 1);
    13.         return 0;
    14. }
    15. BUILDIN_DEF(setwaypoint, "ii"),
    複製代碼
    mob.c

    1. int mob_randomwalk(struct mob_data *md,unsigned int tick)
    複製代碼
    1. y+=md->bl.y;
    複製代碼
    下方增加
    1.                 if(md->self_waypoint != NULL){
    2.                         if(md->waypoint_move < md->self_waypoint->num){
    3.                                 int _x = md->self_waypoint->x[md->waypoint_move];
    4.                                 int _y = md->self_waypoint->y[md->waypoint_move];
    5.                                 md->waypoint_move++;
    6.                                 if((map_getcell(md->bl.m,_x,_y,CELL_CHKPASS)) && unit_walktoxy(&md->bl,_x,_y,1)){
    7.                                         speed=status_get_speed(&md->bl);
    8.                                         for(i=c=0;i<md->ud.walkpath.path_len;i++){        // The next walk start time is calculated.
    9.                                                 if(md->ud.walkpath.path[i]&1)
    10.                                                         c+=speed*14/10;
    11.                                                 else
    12.                                                         c+=speed;
    13.                                         }
    14.                                         md->state.skillstate=MSS_WALK;
    15.                                         md->next_walktime =tick + c -10;
    16.                                         return 1;
    17.                                 }
    18.                         }else{
    19.                                 md->self_waypoint = NULL;
    20.                                 md->waypoint_move = 0;
    21.                         }
    22.                 }else if((map_getcell(md->bl.m,x,y,CELL_CHKPASS)) && unit_walktoxy(&md->bl,x,y,1)){
    23.                         break;
    24.                 }
    複製代碼
    mob.h
    1. char npc_event[50];
    複製代碼
    下方增加:
    1.         //點路
    2.         struct Waypoint *self_waypoint;
    3.         int waypoint_move;
    複製代碼
    map.c
    1. char name[NAME_LENGTH],eventname[50]; //Name/event
    複製代碼
    下方增加:
    1.                 //點路
    2.         struct Waypoint *self_waypoint;
    3.         int waypoint_move;
    複製代碼
    db/waypoint.txt
    1. //支持100行,每行100個座標
    2. //請參照如下格式填寫,
    3. //格式:
    4. 55,111,56,111,57,111,59,111,63,111,67,111,69,111
    5. 111,11,123,15,133//這是不合格的


    6. //注意:座標ID從0遞加
    7. //只帶一個座標的行列無效
    複製代碼
    腳本:
    1. -        script        TT        -1,{
    2. OnWhisperGlobal:
    3.         getmapxy(.@map$,.@x,.@y,0);
    4.         set @gid,bg_monster(0,.@map$,55,111,"Test",1002,"");
    5.         setwaypoint(@gid,0);
    6. }
    複製代碼
    怪物走起路來可能會頓頓的,畢竟是加在Randomwalk...






    =======================================

    8/29優化

    mob.c

    1. static int mob_ai_sub_lazy(struct mob_data *md, va_list args)
    複製代碼


    內兩個
    1. rand()%1000 < MOB_LAZYMOVEPERC(md)
    複製代碼


    替代成
    1. md->self_waypoint != NULL || rand()%1000 < MOB_LAZYMOVEPERC(md)
    複製代碼
    回復

    使用道具 舉報

  • TA的每日心情
    慵懶
    2012-10-4 02:22 AM
  • 簽到天數: 177 天

    連續簽到: 5 天

    [LV.7]常住居民III

    發表於 2011-8-28 20:16:02 | 顯示全部樓層
    1. #define MAX_WAYPOINT 100

    2. struct Waypoint{
    3.         int x[MAX_WAYPOINT];
    4.         int y[MAX_WAYPOINT];
    5.         int num;
    6. }waypoint[MAX_WAYPOINT];
    複製代碼
    這個安全有問題, waypoint[100+]都可以用而且沒有報錯
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

     樓主| 發表於 2011-8-28 20:20:49 | 顯示全部樓層
    本帖最後由 Alopex 於 2011-8-29 03:24 PM 編輯

    回復 2# 為私服而開


       會有問題大概就在這吧...
    1. bl->self_waypoint = &waypoint[script_getnum(st,3)];
    複製代碼



    調整一下..

    ================

    要寫的安全些也不是問題,懶了些
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.9]以壇為家II

    發表於 2011-8-28 22:52:57 | 顯示全部樓層
    = =  好效率。。
    早上&#21018;&#35828;晚上就出&#26469;了 - - 狐狸,我改&#35828;你什么好呢~~~
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-8-28 22:53:47 | 顯示全部樓層
    編譯時沒報錯
    遊戲運行時就error了
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

     樓主| 發表於 2011-8-29 10:13:45 | 顯示全部樓層
    編譯時沒報錯
    遊戲運行時就error了
    rgrg1234 發表於 2011-8-28 10:53 PM



       哪裡Error?
    我測試了...會照著路徑走,只是有點慢...
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

     樓主| 發表於 2011-8-29 10:24:54 | 顯示全部樓層
    編譯時沒報錯
    遊戲運行時就error了
    rgrg1234 發表於 2011-8-28 10:53 PM



       我看到少貼了一段東西..
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-8-29 12:31:10 | 顯示全部樓層
    本帖最後由 rgrg1234 於 2011-8-29 12:40 PM 編輯

    回復 7# Alopex


        撲撲= =...
    好像怪怪的

    摁....成功了
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

     樓主| 發表於 2011-8-29 13:47:42 | 顯示全部樓層
    回復  Alopex


        撲撲= =...
    好像怪怪的

    摁....成功了
    rgrg1234 發表於 2011-8-29 12:31 PM


    有bug再告知吧

    走起來好不順xd雖然不會慢,可是看起來像停了在走
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-8-29 14:21:04 | 顯示全部樓層
    回復 9# Alopex


        走起來莫名的詭異= =...
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

     樓主| 發表於 2011-8-29 14:27:23 | 顯示全部樓層
    本帖最後由 Alopex 於 2011-8-29 02:55 PM 編輯

    回復 10# rgrg1234


       想個辦法優化吧
    ==============

    優化完畢,看起來順了~.~
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-8-29 16:40:55 | 顯示全部樓層
    回復 11# Alopex


        真的順多了
    給你一個:tk_05
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    奮斗
    2013-1-15 03:10 PM
  • 簽到天數: 263 天

    連續簽到: 1 天

    [LV.8]以壇為家I

    發表於 2012-9-21 23:58:31 | 顯示全部樓層
    map.c
    找char name[NAME_LENGTH],eventname[50]; //Name/event
    //點路
    struct Waypoint *self_waypoint;
    int waypoint_move;

    這個具體加在什&#40637;地方的
    我用的是RA的端,在map.c里只在struct map_cache_map_info中找到char name[NAME_LENGTH]

    看不像是,也加了,讀完地圖檔,MAP就檔了

    求解~~
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2023-9-25 11:37 PM
  • 簽到天數: 1686 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

    發表於 2014-2-11 19:19:21 | 顯示全部樓層
    moneymuch 發表於 2012-9-21 11:58 PM
    map.c
    找char name[NAME_LENGTH],eventname[50]; //Name/event
    //點路

    那段應該是在map.h

    char name[NAME_LENGTH],eventname[50]; //Name/event
    不過RA已經改成
    char name[NAME_LENGTH], eventname[EVENT_NAME_LENGTH]; //Name/event

    回復 支持 反對

    使用道具 舉報

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

    本版積分規則

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

    GMT+8, 2024-5-1 08:53 PM , Processed in 0.063860 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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