Browse Source

* Fixed player keeps bleeding when dead.
- if battle_config.invincible_nodamage is true, reflected damage to targets in invincible status is now 1.
* Fixed a script typo i made when i was fixing a typo...

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14164 54d463be-8e91-2dee-dedb-b68131a5f0ec

Inkfish 15 years ago
parent
commit
cc02657862
4 changed files with 15 additions and 11 deletions
  1. 3 0
      Changelog-Trunk.txt
  2. 1 1
      npc/quests/quests_alberta.txt
  3. 3 0
      src/map/pc.c
  4. 8 10
      src/map/status.c

+ 3 - 0
Changelog-Trunk.txt

@@ -3,6 +3,9 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2009/11/23
+	* Fixed player keeps bleeding when dead. [Inkfish]
+	- If battle_config.invincible_nodamage is true, reflected damage to targets in invincible status is now 1.
 2009/11/22
 	* Added 'ipban_cleanup_interval' option which determines how often expired IP bans are cleaned from the database. (bugreport:3734) [Paradox924X]
 	* Modified ipban_check() to only include ipbans that haven't already expired. (bugreport:3734) [Paradox924X]

+ 1 - 1
npc/quests/quests_alberta.txt

@@ -2219,7 +2219,7 @@ tur_dun03,104,171,4	script	Knight#tur3	105,{
 	mes "[Squall]";
 	mes "Am I the only one left? Where are all my comrades?! I... I'm about to go crazy!";
 	next;
-	if(select("Maybe they ran away?:What happened?")) {
+	if(select("Maybe they ran away?:What happened?") == 1) {
 		mes "[Squall]";
 		mes "No, we would never run away from the face of danger.";
 		next;

+ 3 - 0
src/map/pc.c

@@ -7369,6 +7369,9 @@ void pc_bleeding (struct map_session_data *sd, unsigned int diff_tick)
 {
 	int hp = 0, sp = 0;
 
+	//if( pc_isdead(sd) )
+	//	return;
+
 	if (sd->hp_loss.value) {
 		sd->hp_loss.tick += diff_tick;
 		while (sd->hp_loss.tick >= sd->hp_loss.rate) {

+ 8 - 10
src/map/status.c

@@ -628,6 +628,7 @@ int status_charge(struct block_list* bl, int hp, int sp)
 //If flag&1, damage is passive and does not triggers cancelling status changes.
 //If flag&2, fail if target does not has enough to substract.
 //If flag&4, if killed, mob must not give exp/loot.
+//If flag&8, sp loss on dead target.
 int status_damage(struct block_list *src,struct block_list *target,int hp, int sp, int walkdelay, int flag)
 {
 	struct status_data *status;
@@ -653,9 +654,11 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
 		return skill_unit_ondamaged((struct skill_unit *)target, src, hp, gettick());
 
 	status = status_get_status_data(target);
+	if( status == &dummy_status )
+		return 0;
 
-	if( status == &dummy_status || (!status->hp && hp) )
-		return 0; //Invalid targets: no damage or dead
+	if( !status->hp )
+		flag |= 8;
 
 // Let through. battle.c/skill.c have the whole logic of when it's possible or
 // not to hurt someone (and this check breaks pet catching) [Skotlex]
@@ -663,15 +666,10 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
 //		return 0; //Cannot damage a bl not on a map, except when "charging" hp/sp
 
 	sc = status_get_sc(target);
-
 	if( battle_config.invincible_nodamage && src && sc && sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] )
-	{
-		if( !sp )
-			return 0;
 		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_getcurrentskill(src) != PA_PRESSURE )
@@ -751,8 +749,8 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
 		case BL_MER: mercenary_damage((TBL_MER*)target,src,hp,sp); break;
 	}
 
-	if (status->hp)
-  	{	//Still lives!
+	if( status->hp || flag&8 )
+  	{	//Still lives or has been dead before this damage.
 		if (walkdelay)
 			unit_set_walkdelay(target, gettick(), walkdelay, 0);
 		return hp+sp;