Ver código fonte

- Added bNoMiscDamage setting so you can specify misc-damage blocking from skills. Modified battle_calc_damage so that even Pressure and similar skills will be affected by this setting.
- Removed SC_LANDPROTECTOR as it wasn't being used by anything.


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

skotlex 19 anos atrás
pai
commit
2c88556eb7
7 arquivos alterados com 24 adições e 17 exclusões
  1. 3 0
      Changelog-Trunk.txt
  2. 1 0
      db/const.txt
  3. 11 12
      src/map/battle.c
  4. 2 3
      src/map/map.h
  5. 6 0
      src/map/pc.c
  6. 0 1
      src/map/status.c
  7. 1 1
      src/map/status.h

+ 3 - 0
Changelog-Trunk.txt

@@ -4,6 +4,9 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2006/07/30
+	* Added bNoMiscDamage setting so you can specify misc-damage blocking from
+	  skills. Modified battle_calc_damage so that even Pressure and similar
+	  skills will be affected by this setting. [Skotlex]
 	* GS skill updates/fixes [Vicious]
 	* Force all users offline in sql when char-server starts [Toms]
 2006/07/29

+ 1 - 0
db/const.txt

@@ -283,6 +283,7 @@ bNoMagicDamage	2003
 bNoWeaponDamage	2004
 bNoGemStone	2005
 bNoCastCancel2	2006
+bNoMiscDamage	2007
 
 bUnbreakableWeapon	2008
 bUnbreakableArmor	2009

+ 11 - 12
src/map/battle.c

@@ -226,7 +226,6 @@ int battle_attr_fix(struct block_list *src, struct block_list *target, int damag
 int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag)
 {
 	struct map_session_data *sd = NULL;
-	struct mob_data *md = NULL;
 	struct status_change *sc;
 	struct status_change_entry *sci;
 
@@ -235,9 +234,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 	if (!damage)
 		return 0;
 	
-	if (bl->type == BL_MOB) {
-		md=(struct mob_data *)bl;
-	} else if (bl->type == BL_PC) {
+	if (bl->type == BL_PC) {
 		sd=(struct map_session_data *)bl;
 		//Special no damage states
 		if(flag&BF_WEAPON && sd->special_state.no_weapon_damage)
@@ -246,8 +243,14 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 		if(flag&BF_MAGIC && sd->special_state.no_magic_damage)
 			damage -= damage*sd->special_state.no_magic_damage/100;
 
+		if(flag&BF_MISC && sd->special_state.no_misc_damage)
+			damage -= damage*sd->special_state.no_misc_damage/100;
+
 		if(!damage) return 0;
 	}
+	
+	if (skill_num == PA_PRESSURE || skill_num == NJ_ZENYNAGE)
+		return damage; //These two bypass everything else.
 
 	sc = status_get_sc(bl);
 
@@ -271,9 +274,6 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 			status_change_end(bl,SC_SAFETYWALL,-1);
 		}
 	
-		if(sc->data[SC_LANDPROTECTOR].timer!=-1 && flag&BF_MAGIC)
-			return 0;
-		
 		if(sc->data[SC_AUTOGUARD].timer != -1 && flag&BF_WEAPON &&
 			rand()%100 < sc->data[SC_AUTOGUARD].val2) {
 			int delay;
@@ -438,11 +438,11 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 			damage = div_;
 	}
 
-	if( md && !status_isdead(bl) && src != bl) {
+	if( bl->type == BL_MOB && !status_isdead(bl) && src != bl) {
 	  if (damage > 0 )
-			mobskill_event(md,src,gettick(),flag);
+			mobskill_event((TBL_MOB*)bl,src,gettick(),flag);
 	  if (skill_num)
-			mobskill_event(md,src,gettick(),MSC_SKILLUSED|(skill_num<<16));
+			mobskill_event((TBL_MOB*)bl,src,gettick(),MSC_SKILLUSED|(skill_num<<16));
 	}
 
 	return damage;
@@ -2691,8 +2691,7 @@ struct Damage  battle_calc_misc_attack(
 	
 	md.damage=battle_attr_fix(src, target, md.damage, s_ele, tstatus->def_ele, tstatus->ele_lv);
 
-	if (skill_num != PA_PRESSURE && skill_num != NJ_ZENYNAGE) //Pressure ignores all these things... and Throw Money ?
-		md.damage=battle_calc_damage(src,target,md.damage,md.div_,skill_num,skill_lv,md.flag);
+	md.damage=battle_calc_damage(src,target,md.damage,md.div_,skill_num,skill_lv,md.flag);
 	if (map_flag_gvg(target->m))
 		md.damage=battle_calc_gvg_damage(src,target,md.damage,md.div_,skill_num,skill_lv,md.flag);
 

+ 2 - 3
src/map/map.h

@@ -544,7 +544,7 @@ struct map_session_data {
 		struct guild *gmaster_flag;
 	} state;
 	struct {
-		unsigned char no_weapon_damage, no_magic_damage;
+		unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;
 		unsigned killer : 1;
 		unsigned killable : 1;
 		unsigned restart_full_recover : 1;
@@ -1152,7 +1152,7 @@ enum {
 	SP_DELAYRATE,SP_HP_DRAIN_RATE_RACE,SP_SP_DRAIN_RATE_RACE, // 1083-1085
 	
 	SP_RESTART_FULL_RECOVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
-	SP_NO_CASTCANCEL2,SP_FREE1,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010
+	SP_NO_CASTCANCEL2,SP_NO_MISC_DAMAGE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010
 	SP_UNBREAKABLE_SHIELD, SP_LONG_ATK_RATE, // 2011-2012
 
 	SP_CRIT_ATK_RATE, SP_CRITICAL_ADDRACE, SP_NO_REGEN, SP_ADDEFF_WHENHIT, SP_AUTOSPELL_WHENHIT, // 2013-2017
@@ -1165,7 +1165,6 @@ enum {
 	SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE //2041
 	//Before adding another, note that
 	//1077 (SP_FREE, previously disguise),
-	//2007 (SP_FREE2, previously Infinite Endure)
 	//are available!
 };
 

+ 6 - 0
src/map/pc.c

@@ -1625,6 +1625,12 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 		val+= sd->special_state.no_weapon_damage;
 		sd->special_state.no_weapon_damage = cap_value(val,0,100);
 		break;
+	case SP_NO_MISC_DAMAGE:
+		if(sd->state.lr_flag == 2)
+			break;
+		val+= sd->special_state.no_misc_damage;
+		sd->special_state.no_misc_damage = cap_value(val,0,100);
+		break;
 	case SP_NO_GEMSTONE:
 		if(sd->state.lr_flag != 2)
 			sd->special_state.no_gemstone = 1;

+ 0 - 1
src/map/status.c

@@ -246,7 +246,6 @@ void initChangeTables(void) {
 	set_sc(SA_VOLCANO, SC_VOLCANO, SI_BLANK, SCB_WATK);
 	set_sc(SA_DELUGE, SC_DELUGE, SI_BLANK, SCB_MAXHP);
 	set_sc(SA_VIOLENTGALE, SC_VIOLENTGALE, SI_BLANK, SCB_FLEE);
-	add_sc(SA_LANDPROTECTOR, SC_LANDPROTECTOR);
 	add_sc(SA_REVERSEORCISH, SC_ORCISH);
 	add_sc(SA_COMA, SC_COMA);
 	set_sc(BD_ENCORE, SC_DANCING, SI_BLANK, SCB_SPEED);

+ 1 - 1
src/map/status.h

@@ -112,7 +112,7 @@ enum {
 	SC_DELUGE,
 	SC_VIOLENTGALE,
 	SC_WATK_ELEMENT,
-	SC_LANDPROTECTOR,
+	SC_LANDPROTECTOR, //Available
 	SC_ARMOR_ELEMENT,
 	SC_NOCHAT,
 	SC_BABY,