Jump to content
  • 0
Sign in to follow this  
Vanquiser

Devotion Reflect Damage

Question

Original Post : Here

Any One Can Convert This to Hercules ??

Thx in advance :)

 

 

Index: src/map/battle.c
===================================================================
--- src/map/battle.c (revision 15817)
+++ src/map/battle.c (working copy)

@@ -233,10 +233,8 @@
nullpo_ret(target);
sc = status_get_sc(target);
-
- if( sc && sc->data[sC_DEVOTION] && damage > 0 && skill_id != PA_PRESSURE && skill_id != CR_REFLECTSHIELD )
+ //devotion patch by Cyrix (rathena) ([email protected])
+//https://www.facebook.../ragdb.ragnarok
+if( sc && sc->data[sC_DEVOTION] && damage > 0 && skill_id != PA_PRESSURE && skill_id != CR_REFLECTSHIELD )
damage = 0;
-
if ( !battle_config.delay_battle_damage || amotion <= 1 ) {
map_freeblock_lock();
status_fix_damage(src, target, damage, ddelay); // We have to seperate here between reflect damage and others [icescope]
@@ -4186,7 +4184,7 @@
}
else
status_change_end(target, SC_DEVOTION, INVALID_TIMER);
- }
+ }

if (sc && sc->data[sC_AUTOSPELL] && rnd()0 < sc->data[sC_AUTOSPELL]->val4) {
int sp = 0;
Index: src/map/pc.c
===================================================================
--- src/map/pc.c (revision 15817)
+++ src/map/pc.c (working copy)
@@ -6078,8 +6078,7 @@
for(k = 0; k < 5; k++)
if (sd->devotion[k]){
struct map_session_data *devsd = map_id2sd(sd->devotion[k]);
- if (devsd)
- status_change_end(&devsd->bl, SC_DEVOTION, INVALID_TIMER);
+ //devotion patch by Cyrix (rathena) ([email protected])
+//https://www.facebook.../ragdb.ragnarok
+ if (devsd) status_change_end(&devsd->bl,SC_DEVOTION,-1);
sd->devotion[k] = 0;
}

Index: src/map/status.c
===================================================================
--- src/map/status.c (revision 15817)
+++ src/map/status.c (working copy)
@@ -1015,31 +1015,43 @@
// if (!target->prev && !(flag&2))
// return 0; //Cannot damage a bl not on a map, except when "charging" hp/sp

- sc = status_get_sc(target);
- if( hp && battle_config.invincible_nodamage && src && sc && sc->data[sC_INVINCIBLE] && !sc->data[sC_INVINCIBLEOFF] )
- hp = 1;
+ //devotion patch by Cyrix (rathena) ([email protected])
+//https://www.facebook.../ragdb.ragnarok
+ sc = status_get_sc(target);
+

- if( hp && !(flag&1) ) {
+ if( hp && !(flag&(1|8)) ) {
if( sc ) {
struct status_change_entry *sce;
+ if( (sce = sc->data[sC_DEVOTION]) && src && battle_getcurrentskill(src) != PA_PRESSURE )
+ { // Devotion prevents any of the other ailments from ending.
+ struct block_list *d_bl = map_id2bl(sce->val1);
+
+ if( d_bl && (
+ (d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == target->id) ||
+ (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == target->id)
+ ) && check_distance_bl(target, d_bl, sce->val3) )
+ {
+ clif_damage(d_bl, d_bl, gettick(), 0, 0, hp, 0, 0, 0);
+ status_fix_damage(NULL, d_bl, hp, 0);
+ return 0;
+ }
+
+ status_change_end(target, SC_DEVOTION, -1);
+ }
if (sc->data[sC_STONE] && sc->opt1 == OPT1_STONE)
- status_change_end(target, SC_STONE, INVALID_TIMER);
- status_change_end(target, SC_FREEZE, INVALID_TIMER);
- status_change_end(target, SC_SLEEP, INVALID_TIMER);
- status_change_end(target, SC_WINKCHARM, INVALID_TIMER);
- status_change_end(target, SC_CONFUSION, INVALID_TIMER);
- status_change_end(target, SC_TRICKDEAD, INVALID_TIMER);
- status_change_end(target, SC_HIDING, INVALID_TIMER);
- status_change_end(target, SC_CLOAKING, INVALID_TIMER);
- status_change_end(target, SC_CHASEWALK, INVALID_TIMER);
- status_change_end(target, SC_CAMOUFLAGE, INVALID_TIMER);
- status_change_end(target, SC__INVISIBILITY, INVALID_TIMER);
- status_change_end(target, SC_DEEPSLEEP, INVALID_TIMER);
+ status_change_end(target,SC_STONE,-1);
+ status_change_end(target,SC_FREEZE,-1);
+ status_change_end(target,SC_SLEEP,-1);
+ status_change_end(target,SC_WINKCHARM,-1);
+ status_change_end(target,SC_CONFUSION,-1);
+ status_change_end(target,SC_TRICKDEAD,-1);
+ status_change_end(target,SC_HIDING,-1);
+ status_change_end(target,SC_CLOAKING,-1);
+ status_change_end(target,SC_CHASEWALK,-1);
if ((sce=sc->data[sC_ENDURE]) && !sce->val4) {
//Endure count is only reduced by non-players on non-gvg maps.
//val4 signals infinite endure. [skotlex]
if (src && src->type != BL_PC && !map_flag_gvg(target->m) && !map[target->m].flag.battleground && --(sce->val2) < 0)
- status_change_end(target, SC_ENDURE, INVALID_TIMER);
+ status_change_end(target, SC_ENDURE, -1);
}
if ((sce=sc->data[sC_GRAVITATION]) && sce->val3 == BCT_SELF) {
struct skill_unit_group* sg = skill_id2group(sce->val4);
@@ -8235,14 +8247,14 @@
for( i = 0; i < 5; i++ )
{
if( sd->devotion && (tsd = map_id2sd(sd->devotion)) && tsd->sc.data[type] )
- status_change_end(&tsd->bl, type, INVALID_TIMER);
+ status_change_end(&tsd->bl, type, -1);
}
}
else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag )
{ // Clear Status from Master
tsd = ((TBL_MER*)bl)->master;
if( tsd && tsd->sc.data[type] )
- status_change_end(&tsd->bl, type, INVALID_TIMER);
+ status_change_end(&tsd->bl, type, -1);
}
}
break;
@@ -8258,10 +8270,10 @@
clif_devotion(d_bl, NULL);
}

- status_change_end(bl, SC_AUTOGUARD, INVALID_TIMER);
- status_change_end(bl, SC_DEFENDER, INVALID_TIMER);
- status_change_end(bl, SC_REFLECTSHIELD, INVALID_TIMER);
- status_change_end(bl, SC_ENDURE, INVALID_TIMER);
+ status_change_end(bl,SC_AUTOGUARD,-1);
+ status_change_end(bl,SC_DEFENDER,-1);
+ status_change_end(bl,SC_REFLECTSHIELD,-1);
+ status_change_end(bl,SC_ENDURE,-1);
}
break; 
Edited by Vanquiser

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 0

I don't think that rA's source code is that different than Hercules', just some functions have changed in those files as far as I'm aware of. Instead of using a diff patcher you could do those changes manually.

Regards.

Share this post


Link to post
Share on other sites
  • 0

I did it, it's building with a warning but it's nothing serious c:

 src/map/battle.c |  3 ++- src/map/pc.c     |  1 + src/map/status.c | 25 +++++++++++++++++++------ 3 files changed, 22 insertions(+), 7 deletions(-)diff --git a/src/map/battle.c b/src/map/battle.cindex b814321..5221b34 100644--- a/src/map/battle.c+++ b/src/map/battle.c@@ -252,7 +252,8 @@ int battle_delay_damage(int64 tick, int amotion, struct block_list *src, struct 	nullpo_ret(target);  	sc = status->get_sc(target);-+	//devotion patch by Cyrix (rathena) ([email protected])+	//https://www.facebook.../ragdb.ragnarok 	if( sc && sc->data[SC_DEVOTION] && damage > 0 && skill_id != PA_PRESSURE && skill_id != CR_REFLECTSHIELD ) 		damage = 0; diff --git a/src/map/pc.c b/src/map/pc.cindex 9a0760d..48538e3 100644--- a/src/map/pc.c+++ b/src/map/pc.c@@ -6762,6 +6762,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { 	for(j = 0; j < 5; j++) 		if (sd->devotion[j]){ 			struct map_session_data *devsd = map->id2sd(sd->devotion[j]);+ 			if (devsd) 				status_change_end(&devsd->bl, SC_DEVOTION, INVALID_TIMER); 			sd->devotion[j] = 0;diff --git a/src/map/status.c b/src/map/status.cindex 6cfd799..b1af54e 100644--- a/src/map/status.c+++ b/src/map/status.c@@ -1161,13 +1161,26 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp, 	//	if (!target->prev && !(flag&2)) 	//		return 0; //Cannot damage a bl not on a map, except when "charging" hp/sp +	//devotion patch by Cyrix (rathena) ([email protected]) 	sc = status->get_sc(target);-	if( hp && battle_config.invincible_nodamage && src && sc && sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] )-		hp = 1; -	if( hp && !(flag&1) ) {+	if( hp && !(flag&1|8) ) { 		if( sc ) { 			struct status_change_entry *sce;+			if( (sce = sc->data[SC_DEVOTION]) && src && battle->get_current_skill(src) != PA_PRESSURE )+			{ // Devotion prevents any of the other ailments from ending.+				struct block_list *d_bl = map->id2bl(sce->val1);+				if( d_bl && (+							(d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == target->id) ||+							(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == target->id)+							) && check_distance_bl(target, d_bl, sce->val3) )+				{+					clif->damage(d_bl, d_bl, timer->gettick(), 0, 0, hp, 0, 0);+					status_fix_damage(NULL, d_bl, hp, 0);+					return 0;+				}+				status_change_end(target, SC_DEVOTION, -1);+			} 			if (sc->data[SC_STONE] && sc->opt1 == OPT1_STONE) 				status_change_end(target, SC_STONE, INVALID_TIMER); 			status_change_end(target, SC_FREEZE, INVALID_TIMER);@@ -1178,9 +1191,9 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp, 			status_change_end(target, SC_HIDING, INVALID_TIMER); 			status_change_end(target, SC_CLOAKING, INVALID_TIMER); 			status_change_end(target, SC_CHASEWALK, INVALID_TIMER);-			status_change_end(target, SC_CAMOUFLAGE, INVALID_TIMER);-			status_change_end(target, SC__INVISIBILITY, INVALID_TIMER);-			status_change_end(target, SC_DEEP_SLEEP, INVALID_TIMER);+			//status_change_end(target, SC_CAMOUFLAGE, INVALID_TIMER);+			//status_change_end(target, SC__INVISIBILITY, INVALID_TIMER);+			//status_change_end(target, SC_DEEP_SLEEP, INVALID_TIMER); 			if ((sce=sc->data[SC_ENDURE]) && !sce->val4 && !sc->data[SC_LKCONCENTRATION]) { 				//Endure count is only reduced by non-players on non-gvg maps. 				//val4 signals infinite endure. [Skotlex]

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.