浏览代码

Fixed bugreport:6443 where SC_AUTOSHADOWSPELL bypasses flag checking of ground type skills.
Follow up r16591 where using KG_GENWAKU on sitting targets the client doesn't sync with the server in sitting state.

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

rud0lp20 12 年之前
父节点
当前提交
2c36c19978
共有 2 个文件被更改,包括 33 次插入3 次删除
  1. 32 2
      src/map/battle.c
  2. 1 1
      src/map/skill.c

+ 32 - 2
src/map/battle.c

@@ -4810,12 +4810,42 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
 			sd->status.skill[sc->data[SC__AUTOSHADOWSPELL]->val1].id != 0 && sd->status.skill[sc->data[SC__AUTOSHADOWSPELL]->val1].flag == SKILL_FLAG_PLAGIARIZED )
 		{
 			int r_skill = sd->status.skill[sc->data[SC__AUTOSHADOWSPELL]->val1].id,
-				r_lv = sc->data[SC__AUTOSHADOWSPELL]->val2;
+				r_lv = sc->data[SC__AUTOSHADOWSPELL]->val2, type;
 
 			if (r_skill != AL_HOLYLIGHT && r_skill != PR_MAGNUS) {
+				if( (type = skill_get_casttype(r_skill)) == CAST_GROUND ) {
+					int maxcount = 0;
+
+					if( !(BL_PC&battle_config.skill_reiteration) &&
+						skill_get_unit_flag(r_skill)&UF_NOREITERATION )
+							type = -1;
+
+					if( BL_PC&battle_config.skill_nofootset &&
+						skill_get_unit_flag(r_skill)&UF_NOFOOTSET )
+							type = -1;
+
+					if( BL_PC&battle_config.land_skill_limit &&
+						(maxcount = skill_get_maxcount(r_skill, r_lv)) > 0
+					  ) {
+						int v;
+						for(v=0;v<MAX_SKILLUNITGROUP && sd->ud.skillunit[v] && maxcount;v++) {
+							if(sd->ud.skillunit[v]->skill_id == r_skill)
+								maxcount--;
+						}
+						if( maxcount == 0 )
+							type = -1;
+					}
+
+					if( type != CAST_GROUND ){
+							clif_skill_fail(sd,r_skill,USESKILL_FAIL_LEVEL,0);
+							map_freeblock_unlock();
+							return wd.dmg_lv;
+					}
+				}
+
 				sd->state.autocast = 1;
 				skill_consume_requirement(sd,r_skill,r_lv,3);
-				switch( skill_get_casttype(r_skill) ) {
+				switch( type ) {
 				case CAST_GROUND:
 					skill_castend_pos2(src, target->x, target->y, r_skill, r_lv, tick, flag);
 					break;

+ 1 - 1
src/map/skill.c

@@ -8760,7 +8760,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 				if (unit_movepos(bl,x,y,0,0))
 				{
 					clif_skill_damage(bl,bl,tick, status_get_amotion(src), 0, -30000, 1, skillid, -1, 6);
-					if( sd && pc_issit(sd))
+					if( bl->type == BL_PC && pc_issit((TBL_PC*)bl))
 						clif_sitting(bl); //Avoid sitting sync problem
 					clif_slide(bl,x,y) ;
 					sc_start(bl,SC_CONFUSION,80,skilllv,skill_get_time(skillid,skilllv));