|
@@ -11681,8 +11681,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
break;
|
|
|
|
|
|
case SO_WARMER:
|
|
|
- flag|= 8;
|
|
|
case SO_CLOUD_KILL:
|
|
|
+ flag |= (skill_id == SO_WARMER) ? 8 : 4;
|
|
|
skill_unitsetting(src,skill_id,skill_lv,x,y,0);
|
|
|
break;
|
|
|
|
|
@@ -13038,6 +13038,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un
|
|
|
struct block_list *ss; // Actual source that cast the skill unit
|
|
|
struct status_change *sc;
|
|
|
struct status_change_entry *sce;
|
|
|
+ struct status_data *tstatus;
|
|
|
enum sc_type type;
|
|
|
uint16 skill_id;
|
|
|
|
|
@@ -13050,6 +13051,8 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un
|
|
|
nullpo_ret(sg = unit->group);
|
|
|
nullpo_ret(ss = map_id2bl(sg->src_id));
|
|
|
|
|
|
+ tstatus = status_get_status_data(bl);
|
|
|
+
|
|
|
if( (skill_get_type(sg->skill_id) == BF_MAGIC && map_getcell(unit->bl.m, unit->bl.x, unit->bl.y, CELL_CHKLANDPROTECTOR) && sg->skill_id != SA_LANDPROTECTOR) ||
|
|
|
map_getcell(bl->m, bl->x, bl->y, CELL_CHKMAELSTROM) )
|
|
|
return 0; //AoE skills are ineffective. [Skotlex]
|
|
@@ -13302,6 +13305,11 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un
|
|
|
status_change_start(ss, bl, type, 10000, sg->skill_lv, 0, 0, 0, sg->limit, SCSTART_NOICON);
|
|
|
break;
|
|
|
|
|
|
+ case UNT_WARMER:
|
|
|
+ if (!sce && bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON)
|
|
|
+ sc_start2(ss, bl, type, 100, sg->skill_lv, ss->id, skill_get_time(sg->skill_id, sg->skill_lv));
|
|
|
+ break;
|
|
|
+
|
|
|
case UNT_CATNIPPOWDER:
|
|
|
if (sg->src_id == bl->id)
|
|
|
break; // Does not affect the caster or Boss.
|
|
@@ -13938,25 +13946,6 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
|
|
|
skill_attack(skill_get_type(sg->skill_id),ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
|
|
|
break;
|
|
|
|
|
|
- case UNT_WARMER:
|
|
|
- if( bl->type == BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON ) {
|
|
|
- int hp = 0;
|
|
|
- struct status_change *ssc = status_get_sc(ss);
|
|
|
-
|
|
|
- if( ssc && ssc->data[SC_HEATER_OPTION] )
|
|
|
- hp = tstatus->max_hp * 3 * sg->skill_lv / 100;
|
|
|
- else
|
|
|
- hp = tstatus->max_hp * sg->skill_lv / 100;
|
|
|
- if( tstatus->hp != tstatus->max_hp )
|
|
|
- clif_skill_nodamage(&unit->bl, bl, AL_HEAL, hp, 0);
|
|
|
- if( tsc && tsc->data[SC_AKAITSUKI] && hp )
|
|
|
- hp = ~hp + 1;
|
|
|
- status_heal(bl, hp, 0, 0);
|
|
|
- if (tsc && !tsc->data[type]) // Don't apply the status again if it's already active.
|
|
|
- sc_start(ss, bl, type, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv));
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
case UNT_ZEPHYR:
|
|
|
if (ss == bl)
|
|
|
break; // Doesn't affect the Elemental
|
|
@@ -14137,7 +14126,6 @@ int skill_unit_onout(struct skill_unit *src, struct block_list *bl, unsigned int
|
|
|
case UNT_SAFETYWALL:
|
|
|
case UNT_PNEUMA:
|
|
|
case UNT_EPICLESIS://Arch Bishop
|
|
|
- case UNT_WARMER:
|
|
|
if (sce)
|
|
|
status_change_end(bl, type, INVALID_TIMER);
|
|
|
break;
|
|
@@ -14238,6 +14226,7 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, unsigned int tick)
|
|
|
case EL_WATER_BARRIER:
|
|
|
case EL_ZEPHYR:
|
|
|
case EL_POWER_OF_GAIA:
|
|
|
+ case SO_WARMER:
|
|
|
case SO_FIRE_INSIGNIA:
|
|
|
case SO_WATER_INSIGNIA:
|
|
|
case SO_WIND_INSIGNIA:
|