|
@@ -1613,7 +1613,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
|
|
case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION:
|
|
case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION:
|
|
case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM:
|
|
case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM:
|
|
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
|
|
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
|
|
- case SC_HAWKEYES: case SC_GUILDAURA: case SC_PUSH_CART:
|
|
|
|
|
|
+ case SC_HAWKEYES: case SC_PUSH_CART:
|
|
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
|
|
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
|
|
case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION:
|
|
case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION:
|
|
case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING:
|
|
case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING:
|
|
@@ -3370,24 +3370,6 @@ static int skill_check_unit_range2 (struct block_list *bl, int x, int y, uint16
|
|
map_foreachinarea(npc_isnear_sub,bl->m,x - range,y - range,x + range,y + range,type,skill_id);
|
|
map_foreachinarea(npc_isnear_sub,bl->m,x - range,y - range,x + range,y + range,type,skill_id);
|
|
}
|
|
}
|
|
|
|
|
|
-int skill_guildaura_sub (struct map_session_data* sd, int id, int strvit, int agidex)
|
|
|
|
-{
|
|
|
|
- if(id == sd->bl.id && battle_config.guild_aura&16)
|
|
|
|
- return 0; // Do not affect guild leader
|
|
|
|
-
|
|
|
|
- if (sd->sc.data[SC_GUILDAURA]) {
|
|
|
|
- struct status_change_entry *sce = sd->sc.data[SC_GUILDAURA];
|
|
|
|
- if( sce->val3 != strvit || sce->val4 != agidex ) {
|
|
|
|
- sce->val3 = strvit;
|
|
|
|
- sce->val4 = agidex;
|
|
|
|
- status_calc_bl(&sd->bl, status_sc2scb_flag(SC_GUILDAURA));
|
|
|
|
- }
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- sc_start4(&sd->bl,&sd->bl, SC_GUILDAURA,100, 1, id, strvit, agidex, 1000);
|
|
|
|
- return 1;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/*==========================================
|
|
/*==========================================
|
|
* Checks that you have the requirements for casting a skill for homunculus/mercenary.
|
|
* Checks that you have the requirements for casting a skill for homunculus/mercenary.
|
|
* Flag:
|
|
* Flag:
|
|
@@ -4185,49 +4167,48 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
|
|
|
#ifndef RENEWAL
|
|
#ifndef RENEWAL
|
|
case NJ_ISSEN:
|
|
case NJ_ISSEN:
|
|
- status_change_end(src, SC_NEN, INVALID_TIMER);
|
|
|
|
- status_change_end(src, SC_HIDING, INVALID_TIMER);
|
|
|
|
#endif
|
|
#endif
|
|
- // fall through
|
|
|
|
case MO_EXTREMITYFIST:
|
|
case MO_EXTREMITYFIST:
|
|
{
|
|
{
|
|
- short x, y, i = 2; // Move 2 cells for Issen(from target)
|
|
|
|
- struct block_list *mbl = bl;
|
|
|
|
- short dir = 0;
|
|
|
|
|
|
+ struct block_list *mbl = bl; // For NJ_ISSEN
|
|
|
|
+ short x, y, i = 2; // Move 2 cells (From target)
|
|
|
|
+ short dir = map_calc_dir(src,bl->x,bl->y);
|
|
|
|
|
|
|
|
+ if (skill_id == MO_EXTREMITYFIST) {
|
|
|
|
+ mbl = src; // For MO_EXTREMITYFIST
|
|
|
|
+ i = 3; // Move 3 cells (From caster)
|
|
|
|
+ }
|
|
|
|
+ if (dir > 0 && dir < 4)
|
|
|
|
+ x = -i;
|
|
|
|
+ else if (dir > 4)
|
|
|
|
+ x = i;
|
|
|
|
+ else
|
|
|
|
+ x = 0;
|
|
|
|
+ if (dir > 2 && dir < 6)
|
|
|
|
+ y = -i;
|
|
|
|
+ else if (dir == 7 || dir < 2)
|
|
|
|
+ y = i;
|
|
|
|
+ else
|
|
|
|
+ y = 0;
|
|
|
|
+ // Ashura Strike still has slide effect in GVG
|
|
|
|
+ if ((mbl == src || (!map_flag_gvg2(src->m) && !map[src->m].flag.battleground)) &&
|
|
|
|
+ unit_movepos(src, mbl->x + x, mbl->y + y, 1, 1)) {
|
|
|
|
+ clif_slide(src, mbl->x + x, mbl->y + y);
|
|
|
|
+ clif_fixpos(src);
|
|
|
|
+ clif_spiritball(src);
|
|
|
|
+ }
|
|
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
-
|
|
|
|
- if( skill_id == MO_EXTREMITYFIST )
|
|
|
|
- {
|
|
|
|
- mbl = src;
|
|
|
|
- i = 3; // for Asura(from caster)
|
|
|
|
|
|
+ if (skill_id == MO_EXTREMITYFIST) {
|
|
status_set_sp(src, 0, 0);
|
|
status_set_sp(src, 0, 0);
|
|
status_change_end(src, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
|
|
status_change_end(src, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
|
|
status_change_end(src, SC_BLADESTOP, INVALID_TIMER);
|
|
status_change_end(src, SC_BLADESTOP, INVALID_TIMER);
|
|
#ifdef RENEWAL
|
|
#ifdef RENEWAL
|
|
sc_start(src,src,SC_EXTREMITYFIST2,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
|
sc_start(src,src,SC_EXTREMITYFIST2,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
|
#endif
|
|
#endif
|
|
- }else
|
|
|
|
- status_set_hp(src,
|
|
|
|
-#ifdef RENEWAL
|
|
|
|
- max(status_get_max_hp(src)/100, 1)
|
|
|
|
-#else
|
|
|
|
- 1
|
|
|
|
-#endif
|
|
|
|
- , 0);
|
|
|
|
-
|
|
|
|
- dir = map_calc_dir(src,bl->x,bl->y);
|
|
|
|
- if( dir > 0 && dir < 4) x = -i;
|
|
|
|
- else if( dir > 4 ) x = i;
|
|
|
|
- else x = 0;
|
|
|
|
- if( dir > 2 && dir < 6 ) y = -i;
|
|
|
|
- else if( dir == 7 || dir < 2 ) y = i;
|
|
|
|
- else y = 0;
|
|
|
|
- if( (mbl == src || (!map_flag_gvg(src->m) && !map[src->m].flag.battleground) ) && // only NJ_ISSEN don't have slide effect in GVG
|
|
|
|
- unit_movepos(src, mbl->x+x, mbl->y+y, 1, 1) ) {
|
|
|
|
- clif_slide(src, src->x, src->y);
|
|
|
|
- //uncomment this if you want to remove MO_EXTREMITYFIST glitchy walking effect. [malufett]
|
|
|
|
- //clif_fixpos(src);
|
|
|
|
|
|
+ } else {
|
|
|
|
+ status_set_hp(src, 1, 0);
|
|
|
|
+ status_change_end(src, SC_NEN, INVALID_TIMER);
|
|
|
|
+ status_change_end(src, SC_HIDING, INVALID_TIMER);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -4621,34 +4602,36 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
break;
|
|
break;
|
|
#ifdef RENEWAL
|
|
#ifdef RENEWAL
|
|
- case NJ_ISSEN: // teleport for Issen
|
|
|
|
- {
|
|
|
|
- short x, y, i = 2; // Move 2 cells for Issen(from target)
|
|
|
|
- struct block_list *mbl = bl;
|
|
|
|
- short dir = 0;
|
|
|
|
-
|
|
|
|
- status_change_end(src, SC_NEN, INVALID_TIMER);
|
|
|
|
- status_change_end(src, SC_HIDING, INVALID_TIMER);
|
|
|
|
-
|
|
|
|
- skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
|
|
-
|
|
|
|
- status_set_hp(src,max(status_get_max_hp(src)/100, 1),0);
|
|
|
|
-
|
|
|
|
- dir = map_calc_dir(src,bl->x,bl->y);
|
|
|
|
- if( dir > 0 && dir < 4) x = -i;
|
|
|
|
- else if( dir > 4 ) x = i;
|
|
|
|
- else x = 0;
|
|
|
|
- if( dir > 2 && dir < 6 ) y = -i;
|
|
|
|
- else if( dir == 7 || dir < 2 ) y = i;
|
|
|
|
- else y = 0;
|
|
|
|
- if( (mbl == src || (!map_flag_gvg(src->m) && !map[src->m].flag.battleground) ) && // only NJ_ISSEN don't have slide effect in GVG
|
|
|
|
- unit_movepos(src, mbl->x+x, mbl->y+y, 1, 1) ) {
|
|
|
|
- clif_slide(src, src->x, src->y);
|
|
|
|
- //uncomment this if you want to remove MO_EXTREMITYFIST glitchy walking effect. [malufett]
|
|
|
|
- //clif_fixpos(src);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
|
|
+ case NJ_ISSEN: {
|
|
|
|
+ short x, y;
|
|
|
|
+ short dir = map_calc_dir(src, bl->x, bl->y);
|
|
|
|
+
|
|
|
|
+ // Move 2 cells (From target)
|
|
|
|
+ if (dir > 0 && dir < 4)
|
|
|
|
+ x = -2;
|
|
|
|
+ else if (dir > 4)
|
|
|
|
+ x = 2;
|
|
|
|
+ else
|
|
|
|
+ x = 0;
|
|
|
|
+ if (dir > 2 && dir < 6)
|
|
|
|
+ y = -2;
|
|
|
|
+ else if (dir == 7 || dir < 2)
|
|
|
|
+ y = 2;
|
|
|
|
+ else
|
|
|
|
+ y = 0;
|
|
|
|
+ // Doesn't have slide effect in GVG
|
|
|
|
+ if (!map_flag_gvg2(src->m) && !map[src->m].flag.battleground &&
|
|
|
|
+ unit_movepos(src, bl->x + x, bl->y + y, 1, 1)) {
|
|
|
|
+ clif_slide(src, bl->x + x, bl->y + y);
|
|
|
|
+ clif_fixpos(src);
|
|
|
|
+ clif_spiritball(src);
|
|
|
|
+ }
|
|
|
|
+ skill_attack(BF_MISC, src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
|
+ status_set_hp(src, max(status_get_max_hp(src) / 100, 1), 0);
|
|
|
|
+ status_change_end(src, SC_NEN, INVALID_TIMER);
|
|
|
|
+ status_change_end(src, SC_HIDING, INVALID_TIMER);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
#endif
|
|
#endif
|
|
/**
|
|
/**
|
|
* Rune Knight
|
|
* Rune Knight
|
|
@@ -4871,7 +4854,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
// Priority is to release SpellBook
|
|
// Priority is to release SpellBook
|
|
- if( sc && sc->data[SC_READING_SB] )
|
|
|
|
|
|
+ if( sc && sc->data[SC_FREEZE_SP] )
|
|
{ // SpellBook
|
|
{ // SpellBook
|
|
uint16 skill_id, skill_lv, point, s = 0;
|
|
uint16 skill_id, skill_lv, point, s = 0;
|
|
int spell[SC_MAXSPELLBOOK-SC_SPELLBOOK1 + 1];
|
|
int spell[SC_MAXSPELLBOOK-SC_SPELLBOOK1 + 1];
|
|
@@ -4892,10 +4875,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
}else //something went wrong :(
|
|
}else //something went wrong :(
|
|
break;
|
|
break;
|
|
|
|
|
|
- if( sc->data[SC_READING_SB]->val2 > point )
|
|
|
|
- sc->data[SC_READING_SB]->val2 -= point;
|
|
|
|
|
|
+ if( sc->data[SC_FREEZE_SP]->val2 > point )
|
|
|
|
+ sc->data[SC_FREEZE_SP]->val2 -= point;
|
|
else // Last spell to be released
|
|
else // Last spell to be released
|
|
- status_change_end(src, SC_READING_SB, INVALID_TIMER);
|
|
|
|
|
|
+ status_change_end(src, SC_FREEZE_SP, INVALID_TIMER);
|
|
|
|
|
|
if( bl->type != BL_SKILL ) /* skill types will crash the client */
|
|
if( bl->type != BL_SKILL ) /* skill types will crash the client */
|
|
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
@@ -7194,7 +7177,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION:
|
|
case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION:
|
|
case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM:
|
|
case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM:
|
|
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
|
|
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
|
|
- case SC_HAWKEYES: case SC_GUILDAURA: case SC_PUSH_CART:
|
|
|
|
|
|
+ case SC_HAWKEYES: case SC_PUSH_CART:
|
|
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
|
|
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
|
|
case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION:
|
|
case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION:
|
|
case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING:
|
|
case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING:
|
|
@@ -8060,7 +8043,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
uint8 j = 0, calls = 0, called = 0;
|
|
uint8 j = 0, calls = 0, called = 0;
|
|
struct guild *g;
|
|
struct guild *g;
|
|
// i don't know if it actually summons in a circle, but oh well. ;P
|
|
// i don't know if it actually summons in a circle, but oh well. ;P
|
|
- g = sd?sd->state.gmaster_flag:guild_search(status_get_guild_id(src));
|
|
|
|
|
|
+ g = sd?sd->guild:guild_search(status_get_guild_id(src));
|
|
if (!g)
|
|
if (!g)
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -8547,7 +8530,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
|
|
|
case AB_PRAEFATIO:
|
|
case AB_PRAEFATIO:
|
|
if( sd == NULL || sd->status.party_id == 0 || flag&1 )
|
|
if( sd == NULL || sd->status.party_id == 0 || flag&1 )
|
|
- clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start4(src,bl, type, 100, skill_lv, 0, 0, 1, skill_get_time(skill_id, skill_lv)));
|
|
|
|
|
|
+ clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, skill_lv, 0, 0, ( sd->status.party_id ? party_foreachsamemap(party_sub_count, sd, 0) : 1 ), skill_get_time(skill_id, skill_lv)));
|
|
else if( sd )
|
|
else if( sd )
|
|
party_foreachsamemap(skill_area_sub, sd, skill_get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill_castend_nodamage_id);
|
|
party_foreachsamemap(skill_area_sub, sd, skill_get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill_castend_nodamage_id);
|
|
break;
|
|
break;
|
|
@@ -8555,10 +8538,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
case AB_CHEAL:
|
|
case AB_CHEAL:
|
|
if( sd == NULL || sd->status.party_id == 0 || flag&1 ) {
|
|
if( sd == NULL || sd->status.party_id == 0 || flag&1 ) {
|
|
if( sd && tstatus && !battle_check_undead(tstatus->race, tstatus->def_ele) && !tsc->data[SC_BERSERK] ) {
|
|
if( sd && tstatus && !battle_check_undead(tstatus->race, tstatus->def_ele) && !tsc->data[SC_BERSERK] ) {
|
|
|
|
+ int partycount = ( sd->status.party_id ? party_foreachsamemap(party_sub_count, sd, 0) : 0 );
|
|
|
|
+
|
|
i = skill_calc_heal(src, bl, AL_HEAL, pc_checkskill(sd, AL_HEAL), true);
|
|
i = skill_calc_heal(src, bl, AL_HEAL, pc_checkskill(sd, AL_HEAL), true);
|
|
|
|
|
|
|
|
+ if( partycount > 1 )
|
|
|
|
+ i += (i / 100) * (partycount * 10) / 4;
|
|
if( (dstsd && pc_ismadogear(dstsd)) || status_isimmune(bl))
|
|
if( (dstsd && pc_ismadogear(dstsd)) || status_isimmune(bl))
|
|
- i = 0; // Should heal by 0 or won't do anything?? in iRO it breaks the healing to members.. [malufett]
|
|
|
|
|
|
+ i = 0; // Should heal by 0 or won't do anything?? in iRO it breaks the healing to members.. [malufett]
|
|
|
|
|
|
clif_skill_nodamage(bl, bl, skill_id, i, 1);
|
|
clif_skill_nodamage(bl, bl, skill_id, i, 1);
|
|
if( tsc && tsc->data[SC_AKAITSUKI] && i )
|
|
if( tsc && tsc->data[SC_AKAITSUKI] && i )
|
|
@@ -8684,7 +8671,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
case SC_NEUTRALBARRIER_MASTER: case SC_NEUTRALBARRIER:
|
|
case SC_NEUTRALBARRIER_MASTER: case SC_NEUTRALBARRIER:
|
|
case SC_STEALTHFIELD_MASTER: case SC_STEALTHFIELD:
|
|
case SC_STEALTHFIELD_MASTER: case SC_STEALTHFIELD:
|
|
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
|
|
case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD:
|
|
- case SC_HAWKEYES: case SC_GUILDAURA: case SC_PUSH_CART:
|
|
|
|
|
|
+ case SC_HAWKEYES: case SC_PUSH_CART:
|
|
case SC_PARTYFLEE: case SC_GT_REVITALIZE:
|
|
case SC_PARTYFLEE: case SC_GT_REVITALIZE:
|
|
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
|
|
case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE:
|
|
case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM:
|
|
case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM:
|
|
@@ -8872,7 +8859,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
- case WL_READING_SB:
|
|
|
|
|
|
+ case WL_FREEZE_SP:
|
|
if( sd ) {
|
|
if( sd ) {
|
|
struct status_change *sc = status_get_sc(bl);
|
|
struct status_change *sc = status_get_sc(bl);
|
|
|
|
|
|
@@ -8880,7 +8867,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
if( sc && !sc->data[i] )
|
|
if( sc && !sc->data[i] )
|
|
break;
|
|
break;
|
|
if( i == SC_MAXSPELLBOOK ) {
|
|
if( i == SC_MAXSPELLBOOK ) {
|
|
- clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_READING, 0);
|
|
|
|
|
|
+ clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_READING, 0);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -14191,7 +14178,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
|
sd->spiritball_old = require.spiritball = sd->spiritball;
|
|
sd->spiritball_old = require.spiritball = sd->spiritball;
|
|
break;
|
|
break;
|
|
case LG_RAYOFGENESIS:
|
|
case LG_RAYOFGENESIS:
|
|
- if( sc && sc->data[SC_INSPIRATION] )
|
|
|
|
|
|
+ if( sc && sc->data[SC_INSPIRATION] )
|
|
return true; // Don't check for partner.
|
|
return true; // Don't check for partner.
|
|
if( !(sc && sc->data[SC_BANDING]) ) {
|
|
if( !(sc && sc->data[SC_BANDING]) ) {
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
|
|
@@ -14200,7 +14187,9 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
|
return false; // Just fails, no msg here.
|
|
return false; // Just fails, no msg here.
|
|
break;
|
|
break;
|
|
case LG_HESPERUSLIT:
|
|
case LG_HESPERUSLIT:
|
|
- if( !sc || !sc->data[SC_BANDING] ) {
|
|
|
|
|
|
+ if( sc && sc->data[SC_INSPIRATION] )
|
|
|
|
+ return true;
|
|
|
|
+ if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 < 3 ) {
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
@@ -15265,14 +15254,14 @@ int skill_vfcastfix (struct block_list *bl, double time, uint16 skill_id, uint16
|
|
// Fixed cast non percentage bonuses
|
|
// Fixed cast non percentage bonuses
|
|
if( sc->data[SC_MANDRAGORA] )
|
|
if( sc->data[SC_MANDRAGORA] )
|
|
fixed += sc->data[SC_MANDRAGORA]->val1 * 1000 / 2;
|
|
fixed += sc->data[SC_MANDRAGORA]->val1 * 1000 / 2;
|
|
- if (sc->data[SC_IZAYOI] && (skill_id >= NJ_TOBIDOUGU && skill_id <= NJ_ISSEN))
|
|
|
|
- fixed = 0;
|
|
|
|
if( sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_WILD_STORM_OPTION] )
|
|
if( sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_WILD_STORM_OPTION] )
|
|
fixed -= 1000;
|
|
fixed -= 1000;
|
|
if (sc->data[SC_DANCEWITHWUG])
|
|
if (sc->data[SC_DANCEWITHWUG])
|
|
fixed -= fixed * sc->data[SC_DANCEWITHWUG]->val4 / 100;
|
|
fixed -= fixed * sc->data[SC_DANCEWITHWUG]->val4 / 100;
|
|
if( sc->data[SC_HEAT_BARREL] )
|
|
if( sc->data[SC_HEAT_BARREL] )
|
|
fixcast_r = max(fixcast_r, sc->data[SC_HEAT_BARREL]->val2);
|
|
fixcast_r = max(fixcast_r, sc->data[SC_HEAT_BARREL]->val2);
|
|
|
|
+ if (sc->data[SC_IZAYOI])
|
|
|
|
+ fixed = 0;
|
|
}
|
|
}
|
|
|
|
|
|
if( sd && !(skill_get_castnodex(skill_id, skill_lv)&4) ){
|
|
if( sd && !(skill_get_castnodex(skill_id, skill_lv)&4) ){
|
|
@@ -18221,7 +18210,7 @@ int skill_spellbook (struct map_session_data *sd, int nameid) {
|
|
|
|
|
|
for(i=SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) if( sc && !sc->data[i] ) break;
|
|
for(i=SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) if( sc && !sc->data[i] ) break;
|
|
if( i > SC_MAXSPELLBOOK ) {
|
|
if( i > SC_MAXSPELLBOOK ) {
|
|
- clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_READING, 0);
|
|
|
|
|
|
+ clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_READING, 0);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -18229,31 +18218,34 @@ int skill_spellbook (struct map_session_data *sd, int nameid) {
|
|
if( i == MAX_SKILL_SPELLBOOK_DB ) return 0;
|
|
if( i == MAX_SKILL_SPELLBOOK_DB ) return 0;
|
|
|
|
|
|
if( !pc_checkskill(sd, (skill_id = skill_spellbook_db[i].skill_id)) ) { // User don't know the skill
|
|
if( !pc_checkskill(sd, (skill_id = skill_spellbook_db[i].skill_id)) ) { // User don't know the skill
|
|
- sc_start(&sd->bl,&sd->bl, SC_SLEEP, 100, 1, skill_get_time(WL_READING_SB, pc_checkskill(sd,WL_READING_SB)));
|
|
|
|
- clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_DIFFICULT_SLEEP, 0);
|
|
|
|
|
|
+ sc_start(&sd->bl,&sd->bl, SC_SLEEP, 100, 1, skill_get_time(WL_FREEZE_SP, pc_checkskill(sd,WL_FREEZE_SP)));
|
|
|
|
+ clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_DIFFICULT_SLEEP, 0);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
max_preserve = 4 * pc_checkskill(sd, WL_FREEZE_SP) + status_get_int(&sd->bl) / 10 + sd->status.base_level / 10;
|
|
max_preserve = 4 * pc_checkskill(sd, WL_FREEZE_SP) + status_get_int(&sd->bl) / 10 + sd->status.base_level / 10;
|
|
point = skill_spellbook_db[i].point;
|
|
point = skill_spellbook_db[i].point;
|
|
|
|
|
|
- if( sc && sc->data[SC_READING_SB] ) {
|
|
|
|
- if( (sc->data[SC_READING_SB]->val2 + point) > max_preserve ) {
|
|
|
|
- clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0);
|
|
|
|
|
|
+ if( sc && sc->data[SC_FREEZE_SP] ) {
|
|
|
|
+ if( (sc->data[SC_FREEZE_SP]->val2 + point) > max_preserve ) {
|
|
|
|
+ clif_skill_fail(sd, WL_FREEZE_SP, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
for(i = SC_MAXSPELLBOOK; i >= SC_SPELLBOOK1; i--){ // This is how official saves spellbook. [malufett]
|
|
for(i = SC_MAXSPELLBOOK; i >= SC_SPELLBOOK1; i--){ // This is how official saves spellbook. [malufett]
|
|
if( !sc->data[i] ){
|
|
if( !sc->data[i] ){
|
|
- sc->data[SC_READING_SB]->val2 += point; // increase points
|
|
|
|
|
|
+ sc->data[SC_FREEZE_SP]->val2 += point; // increase points
|
|
sc_start4(&sd->bl,&sd->bl, (sc_type)i, 100, skill_id, pc_checkskill(sd,skill_id), point, 0, INVALID_TIMER);
|
|
sc_start4(&sd->bl,&sd->bl, (sc_type)i, 100, skill_id, pc_checkskill(sd,skill_id), point, 0, INVALID_TIMER);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- sc_start2(&sd->bl,&sd->bl, SC_READING_SB, 100, 0, point, INVALID_TIMER);
|
|
|
|
|
|
+ sc_start2(&sd->bl,&sd->bl, SC_FREEZE_SP, 100, 0, point, INVALID_TIMER);
|
|
sc_start4(&sd->bl,&sd->bl, SC_MAXSPELLBOOK, 100, skill_id, pc_checkskill(sd,skill_id), point, 0, INVALID_TIMER);
|
|
sc_start4(&sd->bl,&sd->bl, SC_MAXSPELLBOOK, 100, skill_id, pc_checkskill(sd,skill_id), point, 0, INVALID_TIMER);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // Reading Spell Book SP cost same as the sealed spell.
|
|
|
|
+ status_zap(&sd->bl, 0, skill_get_sp(skill_id, pc_checkskill(sd, skill_id)));
|
|
|
|
+
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|