新增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-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 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 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
q2&3
pc.c
找到下方加入找到下方加入q1:
方法如上一個一個加
大概是這樣
...
rgrg1234 發表於 2011-7-29 12:50 AM http://www.okayro.com/images/common/back.gif
完全無效果... 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. 回復 5# he01204046
哪個沒效果=.=?
我弄好像有呢 这样写 可以是可以`.
但是何必这样呢`?.
你把对aspd的计算 写到 对gvg回避惩罚的计算下面不就结了吗= =~~ (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 刷新 很难吗? sorry ,少了
iter = mapit_getallusers();
打太快~.~ 找到这句..
然后 依葫芦画瓢 写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
哪個沒效果=.=?
我弄好像有呢
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 11:04 PM 編輯
你加錯地方了阿
168行}下方加入 你加到上方.... 你加錯地方了阿
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 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