OK論壇

 找回密碼
 註冊
查看: 6384|回復: 24

[教學] 新增GVG和PVP最大攻速設定 8/1更新

[複製鏈接]
  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

    發表於 2011-7-28 21:03:20 | 顯示全部樓層 |閱讀模式
    本帖最後由 he01204046 於 2011-8-1 10:44 AM 編輯

    首先感謝樓下兩位大大讓此設定可以完成。

    本設定的功能應該不用多說,就是可以另外設定GVG和PVP的最大攻擊速度

    -----------8/1更新----------
    刪減不必要的程式調整

    使用的源碼為:3Ceam r640

    設定值新增:
    \conf\battle\player.conf

    1. -// 最大攻擊速度 (ASPD) (預設值為 190, 最高允許設定 199)
    2. -max_aspd: 190
    3. +// 最大攻擊速度設定 (ASPD) (預設值為 190, 最高允許設定 199)
    4. +// 當地圖同為GVG和PVP,則以GVG的攻速為主。
    5. +// max_aspd為一般地圖的最大攻速
    6. +// gvg_max_aspd為GVG地圖的最大攻速
    7. +// pvp_max_aspd為PVP地圖的最大攻速
    8. +max_aspd: 190
    9. +gvg_max_aspd: 190
    10. +pvp_max_aspd: 190
    複製代碼
    源碼修改-設定篇:
    battle.h
    1.         int max_aspd;
    2. +        int gvg_max_aspd; //公會戰的最大攻速
    3. +        int pvp_max_aspd; //PVP的最大攻速
    複製代碼
    battle.c
    1.         { "max_aspd",                           &battle_config.max_aspd,                        199,    100,    199,            },
    2. +        { "gvg_max_aspd",                       &battle_config.gvg_max_aspd,                    199,    100,    199,            },
    3. +        { "pvp_max_aspd",                       &battle_config.pvp_max_aspd,                    199,    100,    199,            },
    複製代碼
    1.         battle_config.monster_max_aspd = 2000 - battle_config.monster_max_aspd*10;
    2.         battle_config.max_aspd = 2000 - battle_config.max_aspd*10;
    3. +        battle_config.gvg_max_aspd = 2000 - battle_config.gvg_max_aspd*10; //公會戰的最大攻速
    4. +        battle_config.pvp_max_aspd = 2000 - battle_config.pvp_max_aspd*10; //PVP的最大攻速
    複製代碼
    源碼修改-套用篇:
    status.c

    1.         if( flag&SCB_ASPD )
    2.         {
    3.                 int amotion;
    4.                 if( bl->type&BL_PC )
    5.                 {
    6.                         amotion = status_base_amotion_pc(sd,status);
    7.                         status->aspd_rate = status_calc_aspd_rate(bl, sc, b_status->aspd_rate);
    8.                        
    9.                         if(status->aspd_rate != 1000)
    10.                                 amotion = amotion*status->aspd_rate/1000;
    11.                        
    12. -                        status->amotion = cap_value(amotion,battle_config.max_aspd,2000);
    13. +                        if(map[sd->bl.m].flag.gvg){ //公會戰的最大攻速
    14. +                                status->amotion = cap_value(amotion,battle_config.gvg_max_aspd,2000);
    15. +                        }else if(map[sd->bl.m].flag.pvp){ //PVP的最大攻速
    16. +                                status->amotion = cap_value(amotion,battle_config.pvp_max_aspd,2000);
    17. +                        }else{
    18. +                                status->amotion = cap_value(amotion,battle_config.max_aspd,2000);
    19. +                        }
    複製代碼
    源碼修改-刷新篇:
    clif.c
    1.                 if( (battle_config.bg_flee_penalty != 100 || battle_config.gvg_flee_penalty != 100) &&
    2.                         (map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) || map[sd->state.pmap].flag.battleground || map[sd->bl.m].flag.battleground) )
    3.                         status_calc_bl(&sd->bl, SCB_FLEE); //Refresh flee penalty

    4. +                if( map[sd->state.pmap].flag.pvp || map[sd->bl.m].flag.pvp || map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) )
    5. +            status_calc_bl(&sd->bl, SCB_ASPD); // 當在pvp gvg 戰場 地圖時 刷新 aspd  (配合GVG和PVP的最大攻速限制)

    6.                 if( night_flag && map[sd->bl.m].flag.nightenabled )
    7.                 {        //Display night.
    複製代碼
    script.c
    1.                 sd->pvp_won = 0;
    2.                 sd->pvp_lost = 0;
    3. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    4.         }
    5.         mapit_free(iter);
    複製代碼
    1. BUILDIN_FUNC(pvpoff)
    2. {
    3.         int m;
    4.         const char *str;
    5. +        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
    6. +        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制
    複製代碼
    1.         if(battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris]
    2.                 return 0;

    3. +        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
    4. +        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
    5. +        {
    6. +                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
    7. +                        continue;  //配合GVG和PVP的最大攻速限制
    8. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    9. +        }
    10. +        mapit_free(iter); //配合GVG和PVP的最大攻速限制
    11.        
    12.         map_foreachinmap(buildin_pvpoff_sub, m, BL_PC);
    複製代碼
    1. BUILDIN_FUNC(gvgon)
    2. {
    3.         int m;
    4.         const char *str;
    5. +        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
    6. +        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制
    複製代碼
    1.         if(m >= 0 && !map[m].flag.gvg) {
    2.                 map[m].flag.gvg = 1;
    3.                 clif_map_property_mapall(m, MAPPROPERTY_AGITZONE);
    4.         }
    5. +        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
    6. +        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
    7. +        {
    8. +                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
    9. +                        continue;  //配合GVG和PVP的最大攻速限制
    10. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    11. +        }
    12. +        mapit_free(iter); //配合GVG和PVP的最大攻速限制

    13.         return 0;
    複製代碼
    1. BUILDIN_FUNC(gvgoff)
    2. {
    3.         int m;
    4.         const char *str;
    5. +        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
    6. +        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制
    複製代碼
    1.         if(m >= 0 && map[m].flag.gvg) {
    2.                 map[m].flag.gvg = 0;
    3.                 clif_map_property_mapall(m, MAPPROPERTY_NOTHING);
    4.         }

    5. +        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
    6. +        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
    7. +        {
    8. +                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
    9. +                        continue;  //配合GVG和PVP的最大攻速限制
    10. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    11. +        }
    12. +        mapit_free(iter); //配合GVG和PVP的最大攻速限制
    複製代碼
    atcommand.c
    1.         if (sd->pvp_timer != INVALID_TIMER) {
    2.                 delete_timer(sd->pvp_timer, pc_calc_pvprank_timer);
    3.                 sd->pvp_timer = INVALID_TIMER;
    4. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    5.         }
    6.         return 0;
    複製代碼
    1.                 sd->pvp_won = 0;
    2.                 sd->pvp_lost = 0;
    3. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    4.         }
    5.         return 0;
    複製代碼
    1.                 sd->pvp_won = 0;
    2.                 sd->pvp_lost = 0;
    3. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    4.         }
    5.         return 0;
    複製代碼
    1. *
    2. *------------------------------------------*/
    3. +static int atcommand_gvgoff_sub(struct block_list *bl,va_list ap) //配合GVG和PVP的最大攻速限制
    4. +{
    5. +        TBL_PC* sd = (TBL_PC*)bl;
    6. +        if (sd->bl.m == bl->m) {
    7. +                status_calc_pc(sd,0);
    8. +        }
    9. +        return 0;
    10. +}

    11. ACMD_FUNC(gvgoff)
    12. {
    13.         nullpo_retr(-1, sd);
    複製代碼
    1.         map[sd->bl.m].flag.gvg = 0;
    2.         clif_map_property_mapall(sd->bl.m, MAPPROPERTY_NOTHING);
    3. +        map_foreachinmap(atcommand_gvgoff_sub,sd->bl.m, BL_PC); //配合GVG和PVP的最大攻速限制
    4.         map_foreachinmap(atcommand_stopattack,sd->bl.m, BL_CHAR, 0);
    5.         clif_displaymessage(fd, msg_txt(33)); // GvG: Off.
    複製代碼
    1. /*==========================================
    2. *
    3. *------------------------------------------*/
    4. +static int atcommand_gvgon_sub(struct block_list *bl,va_list ap) //配合GVG和PVP的最大攻速限制
    5. +{
    6. +        TBL_PC* sd = (TBL_PC*)bl;
    7. +        if (sd->bl.m == bl->m) {
    8. +                status_calc_pc(sd,0);
    9. +        }
    10. +        return 0;
    11. +}

    12. ACMD_FUNC(gvgon)
    複製代碼
    1.         map[sd->bl.m].flag.gvg = 1;
    2.         clif_map_property_mapall(sd->bl.m, MAPPROPERTY_AGITZONE);
    3. +        map_foreachinmap(atcommand_gvgon_sub,sd->bl.m, BL_PC); //配合GVG和PVP的最大攻速限制
    4.         clif_displaymessage(fd, msg_txt(34)); // GvG: On.
    複製代碼

    評分

    參與人數 1積分 +50 現金 +50 積極性 +50 收起 理由
    勳〃 + 50 + 50 + 50 精品文章

    查看全部評分

    回復

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-28 21:14:20 | 顯示全部樓層
    本帖最後由 Alopex 於 2011-7-29 05:34 PM 編輯

    回復 1# he01204046


       如果用pvpon開
    script.c


    pvpon內

    sd->pvp_lost = 0;
    增加
    status_calc_pc(sd,0);


    gvg麻煩點
    整段改
    1. BUILDIN_FUNC(gvgon)
    2. {
    3.         int m;
    4.         const char *str;
    5.         TBL_PC* sd = NULL;
    6.         struct s_mapiterator* iter;


    7.         str=script_getstr(st,2);
    8.         m = map_mapname2mapid(str);        iter = mapit_getallusers();
    9.         if(m >= 0 && !map[m].flag.gvg) {
    10.                 map[m].flag.gvg = 1;
    11.                 clif_map_property_mapall(m, MAPPROPERTY_AGITZONE);
    12.         }
    13.         for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) )
    14.         {
    15.                 if( sd->bl.m != m )
    16.                         continue;
    17.                 status_calc_pc(sd,0);
    18.         }
    19.         mapit_free(iter);
    20.         return 0;
    21. }
    複製代碼

    評分

    參與人數 1積分 +30 現金 +30 積極性 +30 收起 理由
    勳〃 + 30 + 30 + 30 很熱心 :D

    查看全部評分

    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-28 23:41:25 | 顯示全部樓層
    本帖最後由 he01204046 於 2011-7-28 11:48 PM 編輯

    gvg使用上會出現錯誤,跳出一個錯誤視窗(Microsoft Visual C++ Debug Library)
    Run-Time Cheak Failure #3 - The variable 'iter' is being used without being initialized

    使用pvpon可以正常改變與刷新攻速

    但是有下列更詳細的問題:
    1.使用gm指令的話,無法刷新
    2.角色傳回普通地圖時,無法刷新
    3.角色由普通地圖傳送到pvp或gvg地圖時,無法刷新

    不知道有沒有辦法直接判斷地圖的flag

    當flag改變的時候執行狀態刷新
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-7-29 00:50:34 | 顯示全部樓層
    本帖最後由 rgrg1234 於 2011-7-29 12:51 AM 編輯

    回復 3# he01204046
    q2&3
        pc.c
    找到
    1. int pc_setpos(struct map_session_data* sd, unsigned short mapindex, int x, int y, clr_type clrtype)
    2. {
    複製代碼
    下方加入
    1. struct s_mapiterator* i_pc = mapit_getallusers();
    2.         TBL_PC* pl_sd;
    複製代碼
    找到
    1. sd->md->ud.dir = sd->ud.dir;
    2.         }
    複製代碼
    下方加入
    1.         for( pl_sd = (TBL_PC*)mapit_first(i_pc); mapit_exists(i_pc); pl_sd = (TBL_PC*)mapit_next(i_pc) )

    2.                                 status_calc_pc(pl_sd,0);
    複製代碼
    q1:
    方法如上一個一個加


    大概是這樣
    不知道會不會有甚麼後遺症

    評分

    參與人數 1積分 +30 現金 +30 積極性 +30 收起 理由
    勳〃 + 30 + 30 + 30 很熱心 :D

    查看全部評分

    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-29 08:22:14 | 顯示全部樓層
    回復  he01204046
    q2&3
        pc.c
    找到下方加入找到下方加入q1:
    方法如上一個一個加


    大概是這樣
    ...
    rgrg1234 發表於 2011-7-29 12:50 AM



    完全無效果...
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-29 09:59:06 | 顯示全部樓層
    OK,解決了,感謝樓上兩位大大的幫忙~

    解決方法:
    clif.c
    1. #ifndef TXT_ONLY
    2.         mail_clear(sd);
    3. #endif

    4.         if( map[sd->bl.m].flag.loadevent ) // Lance
    5. +        {
    6.                 npc_script_event(sd, NPCE_LOADMAP);
    7. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    8. +        }
    複製代碼
    script.c
    1.                 sd->pvp_won = 0;
    2.                 sd->pvp_lost = 0;
    3. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    4.         }
    5.         mapit_free(iter);
    複製代碼
    1. BUILDIN_FUNC(pvpoff)
    2. {
    3.         int m;
    4.         const char *str;
    5. +        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
    6. +        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制
    複製代碼
    1.         if(battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris]
    2.                 return 0;

    3. +        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
    4. +        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
    5. +        {
    6. +                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
    7. +                        continue;  //配合GVG和PVP的最大攻速限制
    8. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    9. +        }
    10. +        mapit_free(iter); //配合GVG和PVP的最大攻速限制
    11.        
    12.         map_foreachinmap(buildin_pvpoff_sub, m, BL_PC);
    複製代碼
    1. BUILDIN_FUNC(gvgon)
    2. {
    3.         int m;
    4.         const char *str;
    5. +        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
    6. +        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制
    複製代碼
    1.         if(m >= 0 && !map[m].flag.gvg) {
    2.                 map[m].flag.gvg = 1;
    3.                 clif_map_property_mapall(m, MAPPROPERTY_AGITZONE);
    4.         }
    5. +        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
    6. +        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
    7. +        {
    8. +                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
    9. +                        continue;  //配合GVG和PVP的最大攻速限制
    10. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    11. +        }
    12. +        mapit_free(iter); //配合GVG和PVP的最大攻速限制

    13.         return 0;
    複製代碼
    1. BUILDIN_FUNC(gvgoff)
    2. {
    3.         int m;
    4.         const char *str;
    5. +        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
    6. +        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制
    複製代碼
    1.         if(m >= 0 && map[m].flag.gvg) {
    2.                 map[m].flag.gvg = 0;
    3.                 clif_map_property_mapall(m, MAPPROPERTY_NOTHING);
    4.         }

    5. +        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
    6. +        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
    7. +        {
    8. +                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
    9. +                        continue;  //配合GVG和PVP的最大攻速限制
    10. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    11. +        }
    12. +        mapit_free(iter); //配合GVG和PVP的最大攻速限制
    複製代碼
    atcommand.c
    1.         if (sd->pvp_timer != INVALID_TIMER) {
    2.                 delete_timer(sd->pvp_timer, pc_calc_pvprank_timer);
    3.                 sd->pvp_timer = INVALID_TIMER;
    4. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    5.         }
    6.         return 0;
    複製代碼
    1.                 sd->pvp_won = 0;
    2.                 sd->pvp_lost = 0;
    3. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    4.         }
    5.         return 0;
    複製代碼
    1.                 sd->pvp_won = 0;
    2.                 sd->pvp_lost = 0;
    3. +                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
    4.         }
    5.         return 0;
    複製代碼
    1. *
    2. *------------------------------------------*/
    3. +static int atcommand_gvgoff_sub(struct block_list *bl,va_list ap) //配合GVG和PVP的最大攻速限制
    4. +{
    5. +        TBL_PC* sd = (TBL_PC*)bl;
    6. +        if (sd->bl.m == bl->m) {
    7. +                status_calc_pc(sd,0);
    8. +        }
    9. +        return 0;
    10. +}

    11. ACMD_FUNC(gvgoff)
    12. {
    13.         nullpo_retr(-1, sd);
    複製代碼
    1.         map[sd->bl.m].flag.gvg = 0;
    2.         clif_map_property_mapall(sd->bl.m, MAPPROPERTY_NOTHING);
    3. +        map_foreachinmap(atcommand_gvgoff_sub,sd->bl.m, BL_PC); //配合GVG和PVP的最大攻速限制
    4.         map_foreachinmap(atcommand_stopattack,sd->bl.m, BL_CHAR, 0);
    5.         clif_displaymessage(fd, msg_txt(33)); // GvG: Off.
    複製代碼
    1. /*==========================================
    2. *
    3. *------------------------------------------*/
    4. +static int atcommand_gvgon_sub(struct block_list *bl,va_list ap) //配合GVG和PVP的最大攻速限制
    5. +{
    6. +        TBL_PC* sd = (TBL_PC*)bl;
    7. +        if (sd->bl.m == bl->m) {
    8. +                status_calc_pc(sd,0);
    9. +        }
    10. +        return 0;
    11. +}

    12. ACMD_FUNC(gvgon)
    複製代碼
    1.         map[sd->bl.m].flag.gvg = 1;
    2.         clif_map_property_mapall(sd->bl.m, MAPPROPERTY_AGITZONE);
    3. +        map_foreachinmap(atcommand_gvgon_sub,sd->bl.m, BL_PC); //配合GVG和PVP的最大攻速限制
    4.         clif_displaymessage(fd, msg_txt(34)); // GvG: On.
    複製代碼
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-7-29 14:29:04 | 顯示全部樓層
    回復 5# he01204046


        哪個沒效果=.=?

    我弄好像有呢
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.9]以壇為家II

    發表於 2011-7-29 14:44:17 | 顯示全部樓層
    这样写 可以是可以`.

    但是何必这样呢`?.

    你把对aspd的计算 写到 对gvg回避惩罚的计算下面不就结了吗= =~~
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.9]以壇為家II

    發表於 2011-7-29 14:46:16 | 顯示全部樓層
    1. (map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) || map[sd->state.pmap].flag.battleground || map[sd->bl.m].flag.battleground) )
    2.                         status_calc_bl(&sd->bl, SCB_FLEE); //Refresh flee penalty
    複製代碼
    找到这句..
    然后 依葫芦画瓢 写aspd 刷新 很难吗?
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.6]常住居民II

    發表於 2011-7-29 17:35:38 | 顯示全部樓層
    sorry ,少了
    iter = mapit_getallusers();

    打太快~.~
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-29 20:25:33 | 顯示全部樓層
    找到这句..
    然后 依葫芦画瓢 写aspd 刷新 很难吗?
    dreamunreal 發表於 2011-7-29 02:46 PM



    請問可否交一下詳細設定?我再下面新增這樣沒有用...
    1.                 if( (battle_config.bg_flee_penalty != 100 || battle_config.gvg_flee_penalty != 100) &&
    2.                         (map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) || map[sd->state.pmap].flag.battleground || map[sd->bl.m].flag.battleground) )
    3.                         status_calc_bl(&sd->bl, SCB_FLEE); //Refresh flee penalty

    4.                 if( (battle_config.pvp_max_aspd != battle_config.max_aspd || battle_config.gvg_max_aspd != battle_config.max_aspd) &&
    5.                         (map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) || map[sd->state.pmap].flag.battleground || map[sd->bl.m].flag.battleground ||
    6.                          map_flag_gvg2(sd->state.pmap) || map_flag_gvg2(sd->bl.m) || map_flag_vs(sd->state.pmap) || map_flag_vs(sd->bl.m)) )
    7.                          status_calc_bl(&sd->bl, SCB_ASPD); //Refresh
    複製代碼
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-29 20:33:38 | 顯示全部樓層
    回復  he01204046


        哪個沒效果=.=?

    我弄好像有呢
    rgrg1234 發表於 2011-7-29 02:29 PM



    我照你說的方式打...測試就是沒效果...附上程式碼
    1. int pc_setpos(struct map_session_data* sd, unsigned short mapindex, int x, int y, clr_type clrtype)
    2. {
    3.         struct party_data *p;
    4.         int m;
    5. +    struct s_mapiterator* i_pc = mapit_getallusers();
    6. +    TBL_PC* pl_sd;

    7.         nullpo_ret(sd);

    8.         if( !mapindex || !mapindex_id2name(mapindex) )
    9.         {
    10.                 ShowDebug("pc_setpos: Passed mapindex(%d) is invalid!\n", mapindex);
    11.                 return 1;
    12.         }

    13.         if( pc_isdead(sd) )
    14.         { //Revive dead people before warping them
    15.                 pc_setstand(sd);
    16.                 pc_setrestartvalue(sd,1);
    17.         }

    18.         m = map_mapindex2mapid(mapindex);
    19.         if( map[m].flag.src4instance && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL && p->instance_id )
    20.         {
    21.                 // Request the mapid of this src map into the instance of the party
    22.                 int im = instance_map2imap(m, p->instance_id);
    23.                 if( im < 0 )
    24.                         ; // Player will enter the src map for instances
    25.                 else
    26.                 { // Changes destiny to the instance map, not the source map
    27.                         m = im;
    28.                         mapindex = map_id2index(m);
    29.                 }
    30.         }

    31.         sd->state.changemap = (sd->mapindex != mapindex);
    32.         if( sd->state.changemap )
    33.         { // Misc map-changing settings
    34.                 sd->state.pmap = sd->bl.m;
    35.                 if (sd->sc.count)
    36.                 { // Cancel some map related stuff.
    37.                         if (sd->sc.data[SC_JAILED])
    38.                                 return 1; //You may not get out!
    39.                         status_change_end(&sd->bl, SC_MIRACLE, INVALID_TIMER);
    40.                         status_change_end(&sd->bl, SC_BOSSMAPINFO, INVALID_TIMER);
    41.                         status_change_end(&sd->bl, SC_WARM, INVALID_TIMER);
    42.                         status_change_end(&sd->bl, SC_NEUTRALBARRIER_MASTER, INVALID_TIMER);
    43.                         status_change_end(&sd->bl, SC_NEUTRALBARRIER, INVALID_TIMER);
    44.                         status_change_end(&sd->bl, SC_STEALTHFIELD_MASTER, INVALID_TIMER);
    45.                         status_change_end(&sd->bl, SC_STEALTHFIELD, INVALID_TIMER);
    46.                         status_change_end(&sd->bl, SC_SUN_COMFORT, INVALID_TIMER);
    47.                         status_change_end(&sd->bl, SC_MOON_COMFORT, INVALID_TIMER);
    48.                         status_change_end(&sd->bl, SC_STAR_COMFORT, INVALID_TIMER);
    49.                         if (sd->sc.data[SC_KNOWLEDGE]) {
    50.                                 struct status_change_entry *sce = sd->sc.data[SC_KNOWLEDGE];
    51.                                 if (sce->timer != INVALID_TIMER)
    52.                                         delete_timer(sce->timer, status_change_timer);
    53.                                 sce->timer = add_timer(gettick() + skill_get_time(SG_KNOWLEDGE, sce->val1), status_change_timer, sd->bl.id, SC_KNOWLEDGE);
    54.                         }
    55.                         if (sd->sc.data[SC__SHADOWFORM])
    56.                         {
    57.                                 struct map_session_data *s_sd = map_id2sd(sd->sc.data[SC__SHADOWFORM]->val2);
    58.                                 if( s_sd )
    59.                                         s_sd->shadowform_id = 0;                                       
    60.                                 status_change_end(&sd->bl,SC__SHADOWFORM,-1);
    61.                         }
    62.                         if (sd->sc.data[SC_CURSEDCIRCLE_ATKER])
    63.                                 status_change_end(&sd->bl,SC_CURSEDCIRCLE_ATKER,-1);
    64.                 }
    65.                 if( sd->shadowform_id )
    66.                 {
    67.                         struct block_list *s_bl = map_id2bl(sd->shadowform_id);
    68.                         if( s_bl ) status_change_end(s_bl,SC__SHADOWFORM,-1);
    69.                         sd->shadowform_id = 0;
    70.                 }
    71.                 if (battle_config.clear_unit_onwarp&BL_PC)
    72.                         skill_clear_unitgroup(&sd->bl);
    73.                 party_send_dot_remove(sd); //minimap dot fix [Kevin]
    74.                 guild_send_dot_remove(sd);
    75.                 bg_send_dot_remove(sd);
    76.                 if (sd->regen.state.gc)
    77.                         sd->regen.state.gc = 0;
    78.         }

    79.         if( m < 0 )
    80.         {
    81.                 uint32 ip;
    82.                 uint16 port;
    83.                 //if can't find any map-servers, just abort setting position.
    84.                 if(!sd->mapindex || map_mapname2ipport(mapindex,&ip,&port))
    85.                         return 2;

    86.                 if (sd->npc_id)
    87.                         npc_event_dequeue(sd);
    88.                 npc_script_event(sd, NPCE_LOGOUT);
    89.                 //remove from map, THEN change x/y coordinates
    90.                 unit_remove_map_pc(sd,clrtype);
    91.                 sd->mapindex = mapindex;
    92.                 sd->bl.x=x;
    93.                 sd->bl.y=y;
    94.                 pc_clean_skilltree(sd);
    95.                 chrif_save(sd,2);
    96.                 chrif_changemapserver(sd, ip, (short)port);

    97.                 //Free session data from this map server [Kevin]
    98.                 unit_free_pc(sd);

    99.                 return 0;
    100.         }

    101.         if( x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys )
    102.         {
    103.                 ShowError("pc_setpos: attempt to place player %s (%d:%d) on invalid coordinates (%s-%d,%d)\n", sd->status.name, sd->status.account_id, sd->status.char_id, mapindex_id2name(mapindex),x,y);
    104.                 x = y = 0; // make it random
    105.         }

    106.         if( x == 0 && y == 0 )
    107.         {// pick a random walkable cell
    108.                 do {
    109.                         x=rand()%(map[m].xs-2)+1;
    110.                         y=rand()%(map[m].ys-2)+1;
    111.                 } while(map_getcell(m,x,y,CELL_CHKNOPASS));
    112.         }

    113.         if(sd->bl.prev != NULL){
    114.                 unit_remove_map_pc(sd,clrtype);
    115.                 clif_changemap(sd,map[m].index,x,y); // [MouseJstr]
    116.         } else if(sd->state.active)
    117.                 //Tag player for rewarping after map-loading is done. [Skotlex]
    118.                 sd->state.rewarp = 1;
    119.        
    120.         sd->mapindex = mapindex;
    121.         sd->bl.m = m;
    122.         sd->bl.x = sd->ud.to_x = x;
    123.         sd->bl.y = sd->ud.to_y = y;

    124.         if( sd->status.guild_id > 0 && map[m].flag.gvg_castle )
    125.         {        // Increased guild castle regen [Valaris]
    126.                 struct guild_castle *gc = guild_mapindex2gc(sd->mapindex);
    127.                 if(gc && gc->guild_id == sd->status.guild_id)
    128.                         sd->regen.state.gc = 1;
    129.         }

    130.         if( sd->status.pet_id > 0 && sd->pd && sd->pd->pet.intimate > 0 )
    131.         {
    132.                 sd->pd->bl.m = m;
    133.                 sd->pd->bl.x = sd->pd->ud.to_x = x;
    134.                 sd->pd->bl.y = sd->pd->ud.to_y = y;
    135.                 sd->pd->ud.dir = sd->ud.dir;
    136.         }

    137.         if( merc_is_hom_active(sd->hd) )
    138.         {
    139.                 sd->hd->bl.m = m;
    140.                 sd->hd->bl.x = sd->hd->ud.to_x = x;
    141.                 sd->hd->bl.y = sd->hd->ud.to_y = y;
    142.                 sd->hd->ud.dir = sd->ud.dir;
    143.         }

    144.         if( sd->md )
    145.         {
    146.                 sd->md->bl.m = m;
    147.                 sd->md->bl.x = sd->md->ud.to_x = x;
    148.                 sd->md->bl.y = sd->md->ud.to_y = y;
    149.                 sd->md->ud.dir = sd->ud.dir;
    150. +                for( pl_sd = (TBL_PC*)mapit_first(i_pc); mapit_exists(i_pc); pl_sd = (TBL_PC*)mapit_next(i_pc) )
    151. +                status_calc_pc(pl_sd,0);
    152.         }

    153.         if( sd->ed )
    154.         {
    155.                 sd->ed->bl.m = m;
    156.                 sd->ed->bl.x = sd->ed->ud.to_x = x;
    157.                 sd->ed->bl.y = sd->ed->ud.to_y = y;
    158.                 sd->ed->ud.dir = sd->ud.dir;
    159.         }

    160.         return 0;
    161. }
    複製代碼
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2011-7-29 23:02:49 | 顯示全部樓層
    本帖最後由 rgrg1234 於 2011-7-29 11:04 PM 編輯

    你加錯地方了阿
    168行
    1. }
    複製代碼
    下方加入 你加到上方....
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2020-10-27 09:10 PM
  • 簽到天數: 2555 天

    連續簽到: 1 天

    [LV.Master]伴壇終老

     樓主| 發表於 2011-7-30 01:52:38 | 顯示全部樓層
    你加錯地方了阿
    168行下方加入 你加到上方....
    rgrg1234 發表於 2011-7-29 11:02 PM



    剛剛測試了,是會改變,但是依然有缺失:
    直接使用【@PVP(GVG)ON/OFF】、【PVP(GVG)ON/OFF"地圖名稱"】的情況下,必須刷新地圖或其它會影響到能力變動的情況才會改變。
    回復 支持 反對

    使用道具 舉報

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

    連續簽到: 1 天

    [LV.9]以壇為家II

    發表於 2011-7-30 05:52:22 | 顯示全部樓層
    本帖最後由 dreamunreal 於 2011-7-30 06:10 AM 編輯

    只需要 修改3&#20010;地方.

    第一&#20010; 就是 &#20174;conf &#35835;入&#25968;值.
            int max_aspd;
    +        int gvg_max_aspd; //公會戰的最大攻速
    +        int pvp_max_aspd; //PVP的最大攻速

            { "max_aspd",                           &battle_config.max_aspd,                        199,    100,    199,            },
    +        { "gvg_max_aspd",                       &battle_config.gvg_max_aspd,                    199,    100,    199,            },
    +        { "pvp_max_aspd",                       &battle_config.pvp_max_aspd,                    199,    100,    199,            },
    第二&#20010;地方 就是aspd的上限&#24102;入.
            battle_config.monster_max_aspd = 2000 - battle_config.monster_max_aspd*10;
            battle_config.max_aspd = 2000 - battle_config.max_aspd*10;
    +        battle_config.gvg_max_aspd = 2000 - battle_config.gvg_max_aspd*10; //公會戰的最大攻速
    +        battle_config.pvp_max_aspd = 2000 - battle_config.pvp_max_aspd*10; //PVP的最大攻速



    第三&#20010;地方就是 &#24403;地&#22270;&#26631;&#35760;&#21464;化&#26102; 刷新攻&#20987;速度.
    if( map[sd->state.pmap].flag.pvp || map[sd->bl.m].flag.pvp || map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) )
    +                        status_calc_bl(&sd->bl, SCB_ASPD); // &#24403;在pvp gvg &#25112;&#22330; 地&#22270;&#26102; 刷新 aspd  added by [黑白照]


    其他的 都是多余的控制..

    &#24403;然了  我&#36825;&#20010;方法 &#20165;限于 &#36807;&#22270; 重新&#35745;算攻&#20987;速度

    &#23545;于 pvpon 和gvgon &#36825;种即&#26102;&#24320;&#21551;或&#20851;&#38381;是不&#20250;刷新的. 需要有效 &#35831;&#21442;照白狐的方法 搜索 地&#22270;&#20869;的玩家列表 然后一&#20010;&#20010;的重新&#35745;算aspd
    回復 支持 反對

    使用道具 舉報

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

    本版積分規則

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

    GMT+8, 2024-5-7 09:46 AM , Processed in 0.083415 second(s), 24 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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