he01204046 發表於 2011-7-28 21:03:20

新增GVG和PVP最大攻速設定 8/1更新

本帖最後由 he01204046 於 2011-8-1 10:44 AM 編輯

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

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

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

使用的源碼為:3Ceam r640

設定值新增:
\conf\battle\player.conf
-// 最大攻擊速度 (ASPD) (預設值為 190, 最高允許設定 199)
-max_aspd: 190
+// 最大攻擊速度設定 (ASPD) (預設值為 190, 最高允許設定 199)
+// 當地圖同為GVG和PVP,則以GVG的攻速為主。
+// max_aspd為一般地圖的最大攻速
+// gvg_max_aspd為GVG地圖的最大攻速
+// pvp_max_aspd為PVP地圖的最大攻速
+max_aspd: 190
+gvg_max_aspd: 190
+pvp_max_aspd: 190源碼修改-設定篇:
battle.h        int max_aspd;
+        int gvg_max_aspd; //公會戰的最大攻速
+        int pvp_max_aspd; //PVP的最大攻速
battle.c        { "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,            },        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的最大攻速
源碼修改-套用篇:
status.c
        if( flag&SCB_ASPD )
        {
                int amotion;
                if( bl->type&BL_PC )
                {
                        amotion = status_base_amotion_pc(sd,status);
                        status->aspd_rate = status_calc_aspd_rate(bl, sc, b_status->aspd_rate);
                       
                        if(status->aspd_rate != 1000)
                                amotion = amotion*status->aspd_rate/1000;
                       
-                        status->amotion = cap_value(amotion,battle_config.max_aspd,2000);
+                        if(map.flag.gvg){ //公會戰的最大攻速
+                                status->amotion = cap_value(amotion,battle_config.gvg_max_aspd,2000);
+                        }else if(map.flag.pvp){ //PVP的最大攻速
+                                status->amotion = cap_value(amotion,battle_config.pvp_max_aspd,2000);
+                        }else{
+                                status->amotion = cap_value(amotion,battle_config.max_aspd,2000);
+                        }源碼修改-刷新篇:
clif.c                if( (battle_config.bg_flee_penalty != 100 || battle_config.gvg_flee_penalty != 100) &&
                        (map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) || map.flag.battleground || map.flag.battleground) )
                        status_calc_bl(&sd->bl, SCB_FLEE); //Refresh flee penalty

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

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

+        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
+        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
+        {
+                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
+                        continue;//配合GVG和PVP的最大攻速限制
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
+        }
+        mapit_free(iter); //配合GVG和PVP的最大攻速限制
       
        map_foreachinmap(buildin_pvpoff_sub, m, BL_PC);BUILDIN_FUNC(gvgon)
{
        int m;
        const char *str;
+        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
+        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制        if(m >= 0 && !map.flag.gvg) {
                map.flag.gvg = 1;
                clif_map_property_mapall(m, MAPPROPERTY_AGITZONE);
        }
+        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
+        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
+        {
+                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
+                        continue;//配合GVG和PVP的最大攻速限制
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
+        }
+        mapit_free(iter); //配合GVG和PVP的最大攻速限制

        return 0;BUILDIN_FUNC(gvgoff)
{
        int m;
        const char *str;
+        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
+        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制        if(m >= 0 && map.flag.gvg) {
                map.flag.gvg = 0;
                clif_map_property_mapall(m, MAPPROPERTY_NOTHING);
        }

+        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
+        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
+        {
+                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
+                        continue;//配合GVG和PVP的最大攻速限制
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
+        }
+        mapit_free(iter); //配合GVG和PVP的最大攻速限制atcommand.c        if (sd->pvp_timer != INVALID_TIMER) {
                delete_timer(sd->pvp_timer, pc_calc_pvprank_timer);
                sd->pvp_timer = INVALID_TIMER;
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
        }
        return 0;                sd->pvp_won = 0;
                sd->pvp_lost = 0;
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
        }
        return 0;                sd->pvp_won = 0;
                sd->pvp_lost = 0;
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
        }
        return 0; *
*------------------------------------------*/
+static int atcommand_gvgoff_sub(struct block_list *bl,va_list ap) //配合GVG和PVP的最大攻速限制
+{
+        TBL_PC* sd = (TBL_PC*)bl;
+        if (sd->bl.m == bl->m) {
+                status_calc_pc(sd,0);
+        }
+        return 0;
+}

ACMD_FUNC(gvgoff)
{
        nullpo_retr(-1, sd);        map.flag.gvg = 0;
        clif_map_property_mapall(sd->bl.m, MAPPROPERTY_NOTHING);
+        map_foreachinmap(atcommand_gvgoff_sub,sd->bl.m, BL_PC); //配合GVG和PVP的最大攻速限制
        map_foreachinmap(atcommand_stopattack,sd->bl.m, BL_CHAR, 0);
        clif_displaymessage(fd, msg_txt(33)); // GvG: Off./*==========================================
*
*------------------------------------------*/
+static int atcommand_gvgon_sub(struct block_list *bl,va_list ap) //配合GVG和PVP的最大攻速限制
+{
+        TBL_PC* sd = (TBL_PC*)bl;
+        if (sd->bl.m == bl->m) {
+                status_calc_pc(sd,0);
+        }
+        return 0;
+}

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

Alopex 發表於 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麻煩點
整段改
BUILDIN_FUNC(gvgon)
{
      int m;
      const char *str;
      TBL_PC* sd = NULL;
      struct s_mapiterator* iter;


      str=script_getstr(st,2);
      m = map_mapname2mapid(str);      iter = mapit_getallusers();
      if(m >= 0 && !map.flag.gvg) {
                map.flag.gvg = 1;
                clif_map_property_mapall(m, MAPPROPERTY_AGITZONE);
      }
      for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) )
      {
                if( sd->bl.m != m )
                        continue;
                status_calc_pc(sd,0);
      }
      mapit_free(iter);
      return 0;
}

he01204046 發表於 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改變的時候執行狀態刷新

rgrg1234 發表於 2011-7-29 00:50:34

本帖最後由 rgrg1234 於 2011-7-29 12:51 AM 編輯

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

                                status_calc_pc(pl_sd,0);q1:
方法如上一個一個加


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

he01204046 發表於 2011-7-29 08:22:14

回復he01204046
q2&3
    pc.c
找到下方加入找到下方加入q1:
方法如上一個一個加


大概是這樣
...
rgrg1234 發表於 2011-7-29 12:50 AM http://www.okayro.com/images/common/back.gif


完全無效果...

he01204046 發表於 2011-7-29 09:59:06

OK,解決了,感謝樓上兩位大大的幫忙~

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

        if( map.flag.loadevent ) // Lance
+        {
                npc_script_event(sd, NPCE_LOADMAP);
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
+        }script.c                sd->pvp_won = 0;
                sd->pvp_lost = 0;
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
        }
        mapit_free(iter);BUILDIN_FUNC(pvpoff)
{
        int m;
        const char *str;
+        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
+        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制        if(battle_config.pk_mode) // disable ranking options if pk_mode is on
                return 0;

+        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
+        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
+        {
+                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
+                        continue;//配合GVG和PVP的最大攻速限制
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
+        }
+        mapit_free(iter); //配合GVG和PVP的最大攻速限制
       
        map_foreachinmap(buildin_pvpoff_sub, m, BL_PC);BUILDIN_FUNC(gvgon)
{
        int m;
        const char *str;
+        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
+        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制        if(m >= 0 && !map.flag.gvg) {
                map.flag.gvg = 1;
                clif_map_property_mapall(m, MAPPROPERTY_AGITZONE);
        }
+        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
+        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
+        {
+                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
+                        continue;//配合GVG和PVP的最大攻速限制
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
+        }
+        mapit_free(iter); //配合GVG和PVP的最大攻速限制

        return 0;BUILDIN_FUNC(gvgoff)
{
        int m;
        const char *str;
+        TBL_PC* sd = NULL; //配合GVG和PVP的最大攻速限制
+        struct s_mapiterator* iter; //配合GVG和PVP的最大攻速限制        if(m >= 0 && map.flag.gvg) {
                map.flag.gvg = 0;
                clif_map_property_mapall(m, MAPPROPERTY_NOTHING);
        }

+        iter = mapit_getallusers(); //配合GVG和PVP的最大攻速限制
+        for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) //配合GVG和PVP的最大攻速限制
+        {
+                if( sd->bl.m != m ) //配合GVG和PVP的最大攻速限制
+                        continue;//配合GVG和PVP的最大攻速限制
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
+        }
+        mapit_free(iter); //配合GVG和PVP的最大攻速限制atcommand.c        if (sd->pvp_timer != INVALID_TIMER) {
                delete_timer(sd->pvp_timer, pc_calc_pvprank_timer);
                sd->pvp_timer = INVALID_TIMER;
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
        }
        return 0;                sd->pvp_won = 0;
                sd->pvp_lost = 0;
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
        }
        return 0;                sd->pvp_won = 0;
                sd->pvp_lost = 0;
+                status_calc_pc(sd,0); //配合GVG和PVP的最大攻速限制
        }
        return 0; *
*------------------------------------------*/
+static int atcommand_gvgoff_sub(struct block_list *bl,va_list ap) //配合GVG和PVP的最大攻速限制
+{
+        TBL_PC* sd = (TBL_PC*)bl;
+        if (sd->bl.m == bl->m) {
+                status_calc_pc(sd,0);
+        }
+        return 0;
+}

ACMD_FUNC(gvgoff)
{
        nullpo_retr(-1, sd);        map.flag.gvg = 0;
        clif_map_property_mapall(sd->bl.m, MAPPROPERTY_NOTHING);
+        map_foreachinmap(atcommand_gvgoff_sub,sd->bl.m, BL_PC); //配合GVG和PVP的最大攻速限制
        map_foreachinmap(atcommand_stopattack,sd->bl.m, BL_CHAR, 0);
        clif_displaymessage(fd, msg_txt(33)); // GvG: Off./*==========================================
*
*------------------------------------------*/
+static int atcommand_gvgon_sub(struct block_list *bl,va_list ap) //配合GVG和PVP的最大攻速限制
+{
+        TBL_PC* sd = (TBL_PC*)bl;
+        if (sd->bl.m == bl->m) {
+                status_calc_pc(sd,0);
+        }
+        return 0;
+}

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

rgrg1234 發表於 2011-7-29 14:29:04

回復 5# he01204046


    哪個沒效果=.=?

我弄好像有呢

dreamunreal 發表於 2011-7-29 14:44:17

这样写 可以是可以`.

但是何必这样呢`?.

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

dreamunreal 發表於 2011-7-29 14:46:16

(map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) || map.flag.battleground || map.flag.battleground) )
                        status_calc_bl(&sd->bl, SCB_FLEE); //Refresh flee penalty找到这句..
然后 依葫芦画瓢 写aspd 刷新 很难吗?

Alopex 發表於 2011-7-29 17:35:38

sorry ,少了
iter = mapit_getallusers();

打太快~.~

he01204046 發表於 2011-7-29 20:25:33

找到这句..
然后 依葫芦画瓢 写aspd 刷新 很难吗?
dreamunreal 發表於 2011-7-29 02:46 PM http://www.okayro.com/images/common/back.gif


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

                if( (battle_config.pvp_max_aspd != battle_config.max_aspd || battle_config.gvg_max_aspd != battle_config.max_aspd) &&
                        (map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) || map.flag.battleground || map.flag.battleground ||
                       map_flag_gvg2(sd->state.pmap) || map_flag_gvg2(sd->bl.m) || map_flag_vs(sd->state.pmap) || map_flag_vs(sd->bl.m)) )
                       status_calc_bl(&sd->bl, SCB_ASPD); //Refresh

he01204046 發表於 2011-7-29 20:33:38

回復he01204046


    哪個沒效果=.=?

我弄好像有呢
rgrg1234 發表於 2011-7-29 02:29 PM http://www.okayro.com/images/common/back.gif


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

        nullpo_ret(sd);

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

        if( pc_isdead(sd) )
        { //Revive dead people before warping them
                pc_setstand(sd);
                pc_setrestartvalue(sd,1);
        }

        m = map_mapindex2mapid(mapindex);
        if( map.flag.src4instance && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL && p->instance_id )
        {
                // Request the mapid of this src map into the instance of the party
                int im = instance_map2imap(m, p->instance_id);
                if( im < 0 )
                        ; // Player will enter the src map for instances
                else
                { // Changes destiny to the instance map, not the source map
                        m = im;
                        mapindex = map_id2index(m);
                }
        }

        sd->state.changemap = (sd->mapindex != mapindex);
        if( sd->state.changemap )
        { // Misc map-changing settings
                sd->state.pmap = sd->bl.m;
                if (sd->sc.count)
                { // Cancel some map related stuff.
                        if (sd->sc.data)
                                return 1; //You may not get out!
                        status_change_end(&sd->bl, SC_MIRACLE, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_BOSSMAPINFO, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_WARM, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_NEUTRALBARRIER_MASTER, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_NEUTRALBARRIER, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_STEALTHFIELD_MASTER, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_STEALTHFIELD, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_SUN_COMFORT, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_MOON_COMFORT, INVALID_TIMER);
                        status_change_end(&sd->bl, SC_STAR_COMFORT, INVALID_TIMER);
                        if (sd->sc.data) {
                                struct status_change_entry *sce = sd->sc.data;
                                if (sce->timer != INVALID_TIMER)
                                        delete_timer(sce->timer, status_change_timer);
                                sce->timer = add_timer(gettick() + skill_get_time(SG_KNOWLEDGE, sce->val1), status_change_timer, sd->bl.id, SC_KNOWLEDGE);
                        }
                        if (sd->sc.data)
                        {
                                struct map_session_data *s_sd = map_id2sd(sd->sc.data->val2);
                                if( s_sd )
                                        s_sd->shadowform_id = 0;                                       
                                status_change_end(&sd->bl,SC__SHADOWFORM,-1);
                        }
                        if (sd->sc.data)
                                status_change_end(&sd->bl,SC_CURSEDCIRCLE_ATKER,-1);
                }
                if( sd->shadowform_id )
                {
                        struct block_list *s_bl = map_id2bl(sd->shadowform_id);
                        if( s_bl ) status_change_end(s_bl,SC__SHADOWFORM,-1);
                        sd->shadowform_id = 0;
                }
                if (battle_config.clear_unit_onwarp&BL_PC)
                        skill_clear_unitgroup(&sd->bl);
                party_send_dot_remove(sd); //minimap dot fix
                guild_send_dot_remove(sd);
                bg_send_dot_remove(sd);
                if (sd->regen.state.gc)
                        sd->regen.state.gc = 0;
        }

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

                if (sd->npc_id)
                        npc_event_dequeue(sd);
                npc_script_event(sd, NPCE_LOGOUT);
                //remove from map, THEN change x/y coordinates
                unit_remove_map_pc(sd,clrtype);
                sd->mapindex = mapindex;
                sd->bl.x=x;
                sd->bl.y=y;
                pc_clean_skilltree(sd);
                chrif_save(sd,2);
                chrif_changemapserver(sd, ip, (short)port);

                //Free session data from this map server
                unit_free_pc(sd);

                return 0;
        }

        if( x < 0 || x >= map.xs || y < 0 || y >= map.ys )
        {
                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);
                x = y = 0; // make it random
        }

        if( x == 0 && y == 0 )
        {// pick a random walkable cell
                do {
                        x=rand()%(map.xs-2)+1;
                        y=rand()%(map.ys-2)+1;
                } while(map_getcell(m,x,y,CELL_CHKNOPASS));
        }

        if(sd->bl.prev != NULL){
                unit_remove_map_pc(sd,clrtype);
                clif_changemap(sd,map.index,x,y); //
        } else if(sd->state.active)
                //Tag player for rewarping after map-loading is done.
                sd->state.rewarp = 1;
       
        sd->mapindex = mapindex;
        sd->bl.m = m;
        sd->bl.x = sd->ud.to_x = x;
        sd->bl.y = sd->ud.to_y = y;

        if( sd->status.guild_id > 0 && map.flag.gvg_castle )
        {        // Increased guild castle regen
                struct guild_castle *gc = guild_mapindex2gc(sd->mapindex);
                if(gc && gc->guild_id == sd->status.guild_id)
                        sd->regen.state.gc = 1;
        }

        if( sd->status.pet_id > 0 && sd->pd && sd->pd->pet.intimate > 0 )
        {
                sd->pd->bl.m = m;
                sd->pd->bl.x = sd->pd->ud.to_x = x;
                sd->pd->bl.y = sd->pd->ud.to_y = y;
                sd->pd->ud.dir = sd->ud.dir;
        }

        if( merc_is_hom_active(sd->hd) )
        {
                sd->hd->bl.m = m;
                sd->hd->bl.x = sd->hd->ud.to_x = x;
                sd->hd->bl.y = sd->hd->ud.to_y = y;
                sd->hd->ud.dir = sd->ud.dir;
        }

        if( sd->md )
        {
                sd->md->bl.m = m;
                sd->md->bl.x = sd->md->ud.to_x = x;
                sd->md->bl.y = sd->md->ud.to_y = y;
                sd->md->ud.dir = sd->ud.dir;
+                for( pl_sd = (TBL_PC*)mapit_first(i_pc); mapit_exists(i_pc); pl_sd = (TBL_PC*)mapit_next(i_pc) )
+                status_calc_pc(pl_sd,0);
        }

        if( sd->ed )
        {
                sd->ed->bl.m = m;
                sd->ed->bl.x = sd->ed->ud.to_x = x;
                sd->ed->bl.y = sd->ed->ud.to_y = y;
                sd->ed->ud.dir = sd->ud.dir;
        }

        return 0;
}

rgrg1234 發表於 2011-7-29 23:02:49

本帖最後由 rgrg1234 於 2011-7-29 11:04 PM 編輯

你加錯地方了阿
168行}下方加入 你加到上方....

he01204046 發表於 2011-7-30 01:52:38

你加錯地方了阿
168行下方加入 你加到上方....
rgrg1234 發表於 2011-7-29 11:02 PM http://www.okayro.com/images/common/back.gif


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

dreamunreal 發表於 2011-7-30 05:52:22

本帖最後由 dreamunreal 於 2011-7-30 06:10 AM 編輯

只需要 修改3个地方.

第一个 就是 从conf 读入数值.
      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,            },
第二个地方 就是aspd的上限带入.
      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的最大攻速



第三个地方就是 当地图标记变化时 刷新攻击速度.
if( map.flag.pvp || map.flag.pvp || map_flag_gvg(sd->state.pmap) || map_flag_gvg(sd->bl.m) )
+                        status_calc_bl(&sd->bl, SCB_ASPD); // 当在pvp gvg 战场 地图时 刷新 aspdadded by [黑白照]


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

当然了我这个方法 仅限于 过图 重新计算攻击速度

对于 pvpon 和gvgon 这种即时开启或关闭是不会刷新的. 需要有效 请参照白狐的方法 搜索 地图内的玩家列表 然后一个个的重新计算aspd
頁: [1] 2
查看完整版本: 新增GVG和PVP最大攻速設定 8/1更新