diff options
-rw-r--r-- | Changelog-Trunk.txt | 9 | ||||
-rw-r--r-- | db/Changelog.txt | 3 | ||||
-rw-r--r-- | db/skill_db.txt | 4 | ||||
-rw-r--r-- | src/map/chrif.c | 2 | ||||
-rw-r--r-- | src/map/pc.c | 25 | ||||
-rw-r--r-- | src/map/skill.c | 2 | ||||
-rw-r--r-- | src/map/status.c | 296 |
7 files changed, 177 insertions, 164 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 228cf1a7e..93121da48 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -5,6 +5,15 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EV GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
2006/03/13
+ * Shield Reflect is now passed through Devotion as well. [Skotlex]
+ - Devoted characters lose the devotion effect when the Crusader is at less
+ than 25% Hp. [Skotlex]
+ * chrif_scdata_save will not send a save scdata request when the char has
+ been already tagged as in the final save. [Skotlex]
+ * Some status_change_start cleanups, stuff like blessing should now remove
+ stone/curse even if the status does not begins because the character is
+ already blessed. [Skotlex]
+ * Cleaned SC_SUITON a bit to get rid of that compile warning. [Skotlex]
* Added function battle_calc_gvg_damage for gvg related damage reductions.
Fixes Gravitation being reduced as well as Pressure overriding max-castles
restriction. [Skotlex]
diff --git a/db/Changelog.txt b/db/Changelog.txt index e2b13d77f..76b849e72 100644 --- a/db/Changelog.txt +++ b/db/Changelog.txt @@ -26,6 +26,9 @@ =========================
03/13
+ * Devotion won't work on guildmates now (only party-members) [Skotlex]
+ * Changed Gravity Field's element to earth so that it may hit hidden chars.
+ [Skotlex]
* Added missing mob skills to G_HYDRA, G_PARASITE [Lupus]
* Fixed TK and Soul Linker's position of their job entry in exp2.txt,
thanks to Coltaro. [Skotlex]
diff --git a/db/skill_db.txt b/db/skill_db.txt index f1850ca45..fb0eebd3d 100644 --- a/db/skill_db.txt +++ b/db/skill_db.txt @@ -274,7 +274,7 @@ 252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0 //CR_REFLECTSHIELD#Shield Reflect#
253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0 //CR_HOLYCROSS#Holy Cross#
254,0,6,4,6,0,0,10,1,no,33,256,0,magic,0 //CR_GRANDCROSS#Grand Cross#
-255,7:8:9:10:11,6,16,0,1,0,5,1,yes,0,3584,0,none,0 //CR_DEVOTION#Sacrifice#
+255,7:8:9:10:11,6,16,0,1,0,5,1,yes,0,1536,0,none,0 //CR_DEVOTION#Sacrifice#
256,9,6,16,0,1,0,5,1,yes,0,512,0,none,0 //CR_PROVIDENCE#Resistant Souls#
257,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //CR_DEFENDER#Defending Aura#
258,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0 //CR_SPEARQUICKEN#Spear Quicken#
@@ -503,7 +503,7 @@ 481,0,0,0,0,0,0,5,0,no,0,0,0,none,0 //HP_MANARECHARGE#Mana Recharge#
482,0,6,4,0,1,0,5,1,no,0,0,0,magic,0 //PF_DOUBLECASTING#Double Casting#
483,9,6,2,0,1,0,1,1,no,0,0,0,none,0 //HW_GANBANTEIN#Ganbantein#
-484,9,6,2,0,1,0,5,1,yes,0,0,0,magic,0 //HW_GRAVITATION#Gravity Field#
+484,9,6,2,2,1,0,5,1,yes,0,0,0,magic,0 //HW_GRAVITATION#Gravity Field#
485,-2,6,1,-1,0,0,10,1,no,0,0,0,weapon,0 //WS_CARTTERMINATION#Cart Termination#
486,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0 //WS_OVERTHRUSTMAX#Maximum Power Thrust#
487,0,6,4,0,1,0,5,1,no,0,0,0,none,0 //CG_LONGINGFREEDOM#Longing for Freedom#
diff --git a/src/map/chrif.c b/src/map/chrif.c index 2ba1ede84..4a37e1f1a 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -1155,6 +1155,8 @@ int chrif_save_scdata(struct map_session_data *sd) struct status_change_data data;
struct TimerData *timer;
+ if (sd->state.finalsave) //Character was already saved?
+ return -1;
#ifndef TXT_ONLY
if(charsave_method) //New 'Local' save
{
diff --git a/src/map/pc.c b/src/map/pc.c index af5e362e0..e20f15f75 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2145,11 +2145,11 @@ int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4 switch(type){
case SP_AUTOSPELL:
if(sd->state.lr_flag != 2)
- pc_bonus_autospell(sd->autospell, MAX_PC_BONUS, val?type2:-type2, type3, type4, current_equip_card_id);
+ pc_bonus_autospell(sd->autospell, MAX_PC_BONUS, (val?type2:-type2), type3, type4, current_equip_card_id);
break;
case SP_AUTOSPELL_WHENHIT:
if(sd->state.lr_flag != 2)
- pc_bonus_autospell(sd->autospell2, MAX_PC_BONUS, val?type2:-type2, type3, type4, current_equip_card_id);
+ pc_bonus_autospell(sd->autospell2, MAX_PC_BONUS, (val?type2:-type2), type3, type4, current_equip_card_id);
break;
default:
if(battle_config.error_log)
@@ -5272,14 +5272,21 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) clif_updatestatus(sd,SP_HP);
- if(sd->status.hp>0){
- if(sd->status.hp<sd->status.max_hp>>2 && sd->sc.data[SC_AUTOBERSERK].timer != -1 &&
+
+ if (sd->status.hp<sd->status.max_hp>>2) { //25% HP left effects.
+ if(sd->status.hp>0 && sd->sc.data[SC_AUTOBERSERK].timer != -1 &&
(sd->sc.data[SC_PROVOKE].timer==-1 || sd->sc.data[SC_PROVOKE].val2==0 ))
- // オ?トバ?サ?ク?動
sc_start4(&sd->bl,SC_PROVOKE,100,10,1,0,0,0);
- sd->canlog_tick = gettick();
+ for(i = 0; i < 5; i++)
+ if (sd->devotion[i]){
+ struct map_session_data *devsd = map_id2sd(sd->devotion[i]);
+ if (devsd) status_change_end(&devsd->bl,SC_DEVOTION,-1);
+ }
+ }
+ if(sd->status.hp>0){
+ sd->canlog_tick = gettick();
return damage;
}
@@ -5416,12 +5423,6 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) sd->state.snovice_flag = 4;
}
- for(i = 0; i < 5; i++)
- if (sd->devotion[i]){
- struct map_session_data *devsd = map_id2sd(sd->devotion[i]);
- if (devsd) status_change_end(&devsd->bl,SC_DEVOTION,-1);
- }
-
pc_setdead(sd);
skill_unit_move(&sd->bl,gettick(),4);
if (battle_config.clear_unit_ondeath)
diff --git a/src/map/skill.c b/src/map/skill.c index 716d6ef17..c88666ea3 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1000,7 +1000,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int case AS_GRIMTOOTH:
{
- int type = sd?SC_SLOWDOWN:SC_STOP;
+ int type = dstsd?SC_SLOWDOWN:SC_STOP;
if (tsc->data[type].timer == -1)
sc_start(bl,type,100,skilllv,skill_get_time2(skillid, skilllv));
break;
diff --git a/src/map/status.c b/src/map/status.c index 0edb39ccb..5b44f6ba4 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -1717,14 +1717,8 @@ int status_calc_agi(struct block_list *bl, int agi) agi -= 2 + sc->data[SC_DECREASEAGI].val1;
if(sc->data[SC_QUAGMIRE].timer!=-1)
agi -= sc->data[SC_QUAGMIRE].val1*(bl->type==BL_PC?5:10);
- if(sc->data[SC_SUITON].timer!=-1 && status_get_class(bl) != JOB_NINJA)
- if (sc->data[SC_SUITON].val1 > 7)
- agi -= 8;
- else if (sc->data[SC_SUITON].val1 > 4)
- agi -= 5;
- else if (sc->data[SC_SUITON].val1 > 1)
- agi -= 3;
-
+ if(sc->data[SC_SUITON].timer!=-1)
+ agi -= sc->data[SC_SUITON].val2;
}
return agi;
@@ -3639,7 +3633,113 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val return 0;
}
}
-
+ //Before overlapping fail, one must check for status cured.
+ switch (type) {
+ case SC_BLESSING:
+ if (!undead_flag && race!=6) {
+ if (sc->data[SC_CURSE].timer!=-1)
+ status_change_end(bl,SC_CURSE,-1);
+ if (sc->data[SC_STONE].timer!=-1 && sc->data[SC_STONE].val2==0)
+ status_change_end(bl,SC_STONE,-1);
+ }
+ break;
+ case SC_INCREASEAGI:
+ if(sc->data[SC_DECREASEAGI].timer!=-1 )
+ status_change_end(bl,SC_DECREASEAGI,-1);
+ break;
+ case SC_DONTFORGETME:
+ //is this correct? Maybe all three should stop the same subset of SCs...
+ if(sc->data[SC_ASSNCROS].timer!=-1 )
+ status_change_end(bl,SC_ASSNCROS,-1);
+ case SC_QUAGMIRE:
+ if(sc->data[SC_CONCENTRATE].timer!=-1 )
+ status_change_end(bl,SC_CONCENTRATE,-1);
+ if(sc->data[SC_TRUESIGHT].timer!=-1 )
+ status_change_end(bl,SC_TRUESIGHT,-1);
+ if(sc->data[SC_WINDWALK].timer!=-1 )
+ status_change_end(bl,SC_WINDWALK,-1);
+ //Also blocks the ones below...
+ case SC_DECREASEAGI:
+ if(sc->data[SC_INCREASEAGI].timer!=-1 )
+ status_change_end(bl,SC_INCREASEAGI,-1);
+ if(sc->data[SC_ADRENALINE].timer!=-1 )
+ status_change_end(bl,SC_ADRENALINE,-1);
+ if(sc->data[SC_ADRENALINE2].timer!=-1 )
+ status_change_end(bl,SC_ADRENALINE2,-1);
+ if(sc->data[SC_SPEARSQUICKEN].timer!=-1 )
+ status_change_end(bl,SC_SPEARSQUICKEN,-1);
+ if(sc->data[SC_TWOHANDQUICKEN].timer!=-1 )
+ status_change_end(bl,SC_TWOHANDQUICKEN,-1);
+ if(sc->data[SC_CARTBOOST].timer!=-1 )
+ status_change_end(bl,SC_CARTBOOST,-1);
+ if(sc->data[SC_ONEHAND].timer!=-1 )
+ status_change_end(bl,SC_ONEHAND,-1);
+ break;
+ case SC_ONEHAND:
+ //Removes the Aspd potion effect, as reported by Vicious. [Skotlex]
+ if(sc->data[SC_ASPDPOTION0].timer!=-1)
+ status_change_end(bl,SC_ASPDPOTION0,-1);
+ if(sc->data[SC_ASPDPOTION1].timer!=-1)
+ status_change_end(bl,SC_ASPDPOTION1,-1);
+ if(sc->data[SC_ASPDPOTION2].timer!=-1)
+ status_change_end(bl,SC_ASPDPOTION2,-1);
+ if(sc->data[SC_ASPDPOTION3].timer!=-1)
+ status_change_end(bl,SC_ASPDPOTION3,-1);
+ break;
+ case SC_MAXOVERTHRUST:
+ //Cancels Normal Overthrust. [Skotlex]
+ if (sc->data[SC_OVERTHRUST].timer != -1)
+ status_change_end(bl, SC_OVERTHRUST, -1);
+ break;
+ case SC_KYRIE:
+ // -- moonsoul (added to undo assumptio status if target has it)
+ if(sc->data[SC_ASSUMPTIO].timer!=-1 )
+ status_change_end(bl,SC_ASSUMPTIO,-1);
+ break;
+ case SC_DELUGE:
+ if (sc->data[SC_FOGWALL].timer != -1 && sc->data[SC_BLIND].timer != -1)
+ status_change_end(bl,SC_BLIND,-1);
+ break;
+ case SC_SILENCE:
+ if (sc->data[SC_GOSPEL].timer!=-1 && sc->data[SC_GOSPEL].val4 == BCT_SELF)
+ //Clear Gospel [Skotlex]
+ status_change_end(bl,SC_GOSPEL,-1);
+ break;
+ case SC_HIDING:
+ if(sc->data[SC_CLOSECONFINE].timer != -1)
+ status_change_end(bl, SC_CLOSECONFINE, -1);
+ if(sc->data[SC_CLOSECONFINE2].timer != -1)
+ status_change_end(bl, SC_CLOSECONFINE2, -1);
+ break;
+ case SC_BERSERK: /* バ?サ?ク */
+ if(battle_config.berserk_cancels_buffs)
+ {
+ if (sc->data[SC_ONEHAND].timer != -1)
+ status_change_end(bl,SC_ONEHAND,-1);
+ if (sc->data[SC_TWOHANDQUICKEN].timer != -1)
+ status_change_end(bl,SC_TWOHANDQUICKEN,-1);
+ if (sc->data[SC_CONCENTRATION].timer != -1)
+ status_change_end(bl,SC_CONCENTRATION,-1);
+ if (sc->data[SC_PARRYING].timer != -1)
+ status_change_end(bl,SC_PARRYING,-1);
+ if (sc->data[SC_ENDURE].timer != -1)
+ status_change_end(bl,SC_ENDURE,-1);
+ if (sc->data[SC_AURABLADE].timer != -1)
+ status_change_end(bl,SC_AURABLADE,-1);
+ }
+ break;
+ case SC_ASSUMPTIO:
+ if(sc->data[SC_KYRIE].timer!=-1)
+ status_change_end(bl,SC_KYRIE,-1);
+ break;
+ case SC_CARTBOOST: /* カ?トブ?スト */
+ if(sc->data[SC_DECREASEAGI].timer!=-1 )
+ { //Cancel Decrease Agi, but take no further effect [Skotlex]
+ status_change_end(bl,SC_DECREASEAGI,-1);
+ return 0;
+ }
+ break;
+ }
//Check for overlapping fails
if(sc->data[type].timer != -1){
switch (type) {
@@ -3677,7 +3777,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val break;
default:
if(sc->data[type].val1 > val1)
- return 0;
+ return 1; //Return true to not mess up skill animations. [Skotlex
}
(sc->count)--;
delete_timer(sc->data[type].timer, status_change_timer);
@@ -3711,28 +3811,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val }
break;
- case SC_INCREASEAGI: /* 速度上昇 */
- calc_flag = 1;
- if(sc->data[SC_DECREASEAGI].timer!=-1 )
- status_change_end(bl,SC_DECREASEAGI,-1);
- break;
- case SC_DECREASEAGI: /* 速度減少 */
- calc_flag = 1;
- if(sc->data[SC_INCREASEAGI].timer!=-1 )
- status_change_end(bl,SC_INCREASEAGI,-1);
- if(sc->data[SC_ADRENALINE].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE,-1);
- if(sc->data[SC_ADRENALINE2].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE2,-1);
- if(sc->data[SC_SPEARSQUICKEN].timer!=-1 )
- status_change_end(bl,SC_SPEARSQUICKEN,-1);
- if(sc->data[SC_TWOHANDQUICKEN].timer!=-1 )
- status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- if(sc->data[SC_CARTBOOST].timer!=-1 )
- status_change_end(bl,SC_CARTBOOST,-1);
- if(sc->data[SC_ONEHAND].timer!=-1 )
- status_change_end(bl,SC_ONEHAND,-1);
- break;
case SC_SIGNUMCRUCIS: /* シグナムクルシス */
calc_flag = 1;
val2 = 10 + val1*2;
@@ -3740,21 +3818,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val tick = 600*1000;
clif_emotion(bl,4);
break;
- case SC_ONEHAND: //Removes the Aspd potion effect, as reported by Vicious. [Skotlex]
- if(sc->data[SC_ASPDPOTION0].timer!=-1)
- status_change_end(bl,SC_ASPDPOTION0,-1);
- if(sc->data[SC_ASPDPOTION1].timer!=-1)
- status_change_end(bl,SC_ASPDPOTION1,-1);
- if(sc->data[SC_ASPDPOTION2].timer!=-1)
- status_change_end(bl,SC_ASPDPOTION2,-1);
- if(sc->data[SC_ASPDPOTION3].timer!=-1)
- status_change_end(bl,SC_ASPDPOTION3,-1);
- calc_flag = 1;
- break;
- case SC_MAXOVERTHRUST: //Cancels Normal Overthrust. [Skotlex]
- if (sc->data[SC_OVERTHRUST].timer != -1)
- status_change_end(bl, SC_OVERTHRUST, -1);
- break;
case SC_MAXIMIZEPOWER: /* マキシマイズパワ?(SPが1減る時間,val2にも) */
if (!(flag&4))
{
@@ -3780,37 +3843,11 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val val2 = status_get_max_hp(bl) * (val1 * 2 + 10) / 100;/* 耐久度 */
val3 = (val1 / 2 + 5); /* 回? */
}
-// -- moonsoul (added to undo assumptio status if target has it)
- if(sc->data[SC_ASSUMPTIO].timer!=-1 )
- status_change_end(bl,SC_ASSUMPTIO,-1);
break;
case SC_MINDBREAKER:
calc_flag = 1;
if(tick <= 0) tick = 1000; /* (オ?トバ?サ?ク) */
break;
- case SC_QUAGMIRE: /* クァグマイア */
- calc_flag = 1;
- if(sc->data[SC_CONCENTRATE].timer!=-1 ) /* 集中力向上解除 */
- status_change_end(bl,SC_CONCENTRATE,-1);
- if(sc->data[SC_INCREASEAGI].timer!=-1 ) /* 速度上昇解除 */
- status_change_end(bl,SC_INCREASEAGI,-1);
- if(sc->data[SC_TWOHANDQUICKEN].timer!=-1 )
- status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- if(sc->data[SC_ONEHAND].timer!=-1 )
- status_change_end(bl,SC_ONEHAND,-1);
- if(sc->data[SC_SPEARSQUICKEN].timer!=-1 )
- status_change_end(bl,SC_SPEARSQUICKEN,-1);
- if(sc->data[SC_ADRENALINE].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE,-1);
- if(sc->data[SC_ADRENALINE2].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE2,-1);
- if(sc->data[SC_TRUESIGHT].timer!=-1 ) /* トゥル?サイト */
- status_change_end(bl,SC_TRUESIGHT,-1);
- if(sc->data[SC_WINDWALK].timer!=-1 ) /* ウインドウォ?ク */
- status_change_end(bl,SC_WINDWALK,-1);
- if(sc->data[SC_CARTBOOST].timer!=-1 ) /* カ?トブ?スト */
- status_change_end(bl,SC_CARTBOOST,-1);
- break;
case SC_MAGICPOWER:
calc_flag = 1;
val2 = 1;
@@ -3853,17 +3890,34 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val calc_flag = 1;
val3 = val1*10;
break;
- case SC_DELUGE:
- calc_flag = 1;
- if (sc->data[SC_FOGWALL].timer != -1 && sc->data[SC_BLIND].timer != -1)
- status_change_end(bl,SC_BLIND,-1);
- break;
case SC_VIOLENTGALE:
calc_flag = 1;
val3 = val1*3;
break;
case SC_SUITON:
calc_flag = 1;
+ if (flag&4)
+ break;
+ if (status_get_class(bl) != JOB_NINJA) {
+ //Is there some kind of formula behind this?
+ switch ((val1+1)/3) {
+ case 3:
+ val2 = 8;
+ break;
+ case 2:
+ val2 = 5;
+ break;
+ case 1:
+ val2 = 3;
+ break;
+ case 0:
+ val2 = 0;
+ break;
+ default:
+ val2 = 3*((val1+1)/3);
+ break;
+ }
+ } else val2 = 0;
break;
case SC_SPEARSQUICKEN: /* スピアクイッケン */
@@ -3875,29 +3929,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val if(val2==2) clif_bladestop((struct block_list *)val3,(struct block_list *)val4,1);
break;
- case SC_DONTFORGETME: /* 私を忘れないで */
- calc_flag = 1;
- if(sc->data[SC_INCREASEAGI].timer!=-1 ) /* 速度上昇解除 */
- status_change_end(bl,SC_INCREASEAGI,-1);
- if(sc->data[SC_TWOHANDQUICKEN].timer!=-1 )
- status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- if(sc->data[SC_ONEHAND].timer!=-1 )
- status_change_end(bl,SC_ONEHAND,-1);
- if(sc->data[SC_SPEARSQUICKEN].timer!=-1 )
- status_change_end(bl,SC_SPEARSQUICKEN,-1);
- if(sc->data[SC_ADRENALINE].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE,-1);
- if(sc->data[SC_ADRENALINE2].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE2,-1);
- if(sc->data[SC_ASSNCROS].timer!=-1 )
- status_change_end(bl,SC_ASSNCROS,-1);
- if(sc->data[SC_TRUESIGHT].timer!=-1 ) /* トゥル?サイト */
- status_change_end(bl,SC_TRUESIGHT,-1);
- if(sc->data[SC_WINDWALK].timer!=-1 ) /* ウインドウォ?ク */
- status_change_end(bl,SC_WINDWALK,-1);
- if(sc->data[SC_CARTBOOST].timer!=-1 ) /* カ?トブ?スト */
- status_change_end(bl,SC_CARTBOOST,-1);
- break;
case SC_MOONLIT:
val2 = bl->id;
skill_setmapcell(bl,CG_MOONLIT, val1, CELL_SETMOONLIT);
@@ -4016,14 +4047,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val }
break;
- case SC_SILENCE: /* 沈?(レックスデビ?ナ) */
- if (sc->data[SC_GOSPEL].timer!=-1) {
- if (sc->data[SC_GOSPEL].val4 == BCT_SELF) { //Clear Gospel [Skotlex]
- status_change_end(bl,SC_GOSPEL,-1);
- }
- break;
- }
- break;
case SC_CONFUSION:
clif_emotion(bl,1);
break;
@@ -4034,10 +4057,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val /* option */
case SC_HIDING: /* ハイディング */
calc_flag = 1;
- if(sc->data[SC_CLOSECONFINE].timer != -1)
- status_change_end(bl, SC_CLOSECONFINE, -1);
- if(sc->data[SC_CLOSECONFINE2].timer != -1)
- status_change_end(bl, SC_CLOSECONFINE2, -1);
if(bl->type == BL_PC && !(flag&4)) {
val2 = tick / 1000; /* 持?時間 */
tick = 1000;
@@ -4134,21 +4153,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val break;
case SC_BERSERK: /* バ?サ?ク */
- if(battle_config.berserk_cancels_buffs)
- {
- if (sc->data[SC_ONEHAND].timer != -1)
- status_change_end(bl,SC_ONEHAND,-1);
- if (sc->data[SC_TWOHANDQUICKEN].timer != -1)
- status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- if (sc->data[SC_CONCENTRATION].timer != -1)
- status_change_end(bl,SC_CONCENTRATION,-1);
- if (sc->data[SC_PARRYING].timer != -1)
- status_change_end(bl,SC_PARRYING,-1);
- if (sc->data[SC_ENDURE].timer != -1)
- status_change_end(bl,SC_ENDURE,-1);
- if (sc->data[SC_AURABLADE].timer != -1)
- status_change_end(bl,SC_AURABLADE,-1);
- }
if(sd && !(flag&4)){
sd->status.hp = sd->status.max_hp * 3;
sd->status.sp = 0;
@@ -4161,11 +4165,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val calc_flag = 1;
break;
- case SC_ASSUMPTIO: /* アスムプティオ */
- if(sc->data[SC_KYRIE].timer!=-1)
- status_change_end(bl,SC_KYRIE,-1);
- break;
-
case SC_WARM: //SG skills [Komurka]
if (!(flag&4)) {
val2 = tick/100;
@@ -4243,6 +4242,10 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val type2 = SC_DEFENDER;
if (src->sc.data[type2].timer != -1)
sc_start(bl,type2,100,src->sc.data[type2].val1,skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1));
+ type2 = SC_REFLECTSHIELD;
+ if (src->sc.data[type2].timer != -1)
+ sc_start(bl,type2,100,src->sc.data[type2].val1,skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1));
+
}
break;
}
@@ -4251,15 +4254,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val battle_damage(NULL, bl, status_get_hp(bl)-1, 0);
return 1;
- case SC_CARTBOOST: /* カ?トブ?スト */
- if(sc->data[SC_DECREASEAGI].timer!=-1 )
- { //Cancel Decrease Agi, but take no further effect [Skotlex]
- status_change_end(bl,SC_DECREASEAGI,-1);
- return 0;
- }
- calc_flag = 1;
- break;
-
case SC_CLOSECONFINE2:
{
struct block_list *src = val2?map_id2bl(val2):NULL;
@@ -4324,12 +4318,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val calc_flag = 1;
break;
case SC_BLESSING:
- if (bl->type==BL_PC || (!undead_flag && race!=6)) {
- if (sc->data[SC_CURSE].timer!=-1)
- status_change_end(bl,SC_CURSE,-1);
- if (sc->data[SC_STONE].timer!=-1 && sc->data[SC_STONE].val2==0)
- status_change_end(bl,SC_STONE,-1);
- }
case SC_CONCENTRATION: /* コンセントレ?ション */case SC_ETERNALCHAOS: /* エタ?ナルカオス */
case SC_DRUMBATTLE: /* ?太鼓の響き */
case SC_NIBELUNGEN: /* ニ?ベルングの指輪 */
@@ -4398,9 +4386,15 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val case SC_SKA:
case SC_TWOHANDQUICKEN: /* 2HQ */
case SC_MIRACLE:
+ case SC_INCREASEAGI: /* 速度上昇 */
+ case SC_DECREASEAGI: /* 速度減少 */
+ case SC_ONEHAND:
+ case SC_DONTFORGETME: /* 私を忘れないで */
+ case SC_DELUGE:
+ case SC_CARTBOOST: /* カ?トブ?スト */
+ case SC_QUAGMIRE: /* クァグマイア */
calc_flag = 1;
break;
-
case SC_LULLABY: /* 子守唄 */
case SC_RICHMANKIM:
case SC_ROKISWEIL: /* ロキの叫び */
@@ -4449,6 +4443,9 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val case SC_KAAHI:
case SC_INTRAVISION:
case SC_BASILICA:
+ case SC_MAXOVERTHRUST:
+ case SC_SILENCE: /* 沈?(レックスデビ?ナ) */
+ case SC_ASSUMPTIO: /* アスムプティオ */
break;
// gs_something1 [Vicious]
case SC_MADNESSCANCEL:
@@ -4857,6 +4854,7 @@ int status_change_end( struct block_list* bl , int type,int tid ) case SC_DEFENDER:
calc_flag = 1;
+ case SC_REFLECTSHIELD:
case SC_AUTOGUARD:
if (sd) {
struct map_session_data *tsd;
|