- Updated Basilica, Sharp Shooting, Berserk, Meditatio

- Fixed a typo with Blade Stop that was causing crashes, sorry. ^^;
- Reverted changes to Cloaking, ours is already more updated (than Freya!) ^_^

git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@293 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
celest 2004-11-21 14:48:28 +00:00
parent 0be79fa569
commit 20ee33f1bc
6 changed files with 161 additions and 114 deletions

View File

@ -1,5 +1,9 @@
Date Added Date Added
11/21 11/21
* Skill updates: [Celest]
- Updated Basilica, Sharp Shooting, Berserk, Meditatio (Thanks to DracoRPG!)
- Fixed a typo with Blade Stop that was causing crashes, sorry. ^^;
- Reverted changes to Cloaking, ours is already more updated! ^_^
* @alive, @raisemap, @raise now display the resurrection skill animation [MC Cameri] * @alive, @raisemap, @raise now display the resurrection skill animation [MC Cameri]
* @charpetrename(AtCommand) is now #petrename(CharCommand) [MC Cameri] * @charpetrename(AtCommand) is now #petrename(CharCommand) [MC Cameri]
* @charjob/(AtCommand) is now #jobchange(CharCommand) [MC Cameri] * @charjob/(AtCommand) is now #jobchange(CharCommand) [MC Cameri]
@ -9,6 +13,7 @@ Date Added
- Less congestion in atcommand.c - Less congestion in atcommand.c
- Port commands that start with @char to #, example: - Port commands that start with @char to #, example:
~ @charoption will now be #option ~ @charoption will now be #option
11/20 11/20
* Added str_lower() function to atcommand.c (from OA). [MC Cameri] * Added str_lower() function to atcommand.c (from OA). [MC Cameri]
* Simplified @charchangesex to @charchangesex [player], your sex is changed to the opposite one [MC Cameri] * Simplified @charchangesex to @charchangesex [player], your sex is changed to the opposite one [MC Cameri]
@ -25,7 +30,6 @@ Date Added
* Added @whozeny. Shows list of top 50 online players and their zeny sorted from highest to lowest. [Valaris] * Added @whozeny. Shows list of top 50 online players and their zeny sorted from highest to lowest. [Valaris]
* Added @happyhappyjoyjoy. Makes all players on server do a random emote. [Valaris] * Added @happyhappyjoyjoy. Makes all players on server do a random emote. [Valaris]
* Removed -funroll-loops from compile, thanks to kashy for pointing out the problems caused by this. (Do not re-add!) [Valaris] * Removed -funroll-loops from compile, thanks to kashy for pointing out the problems caused by this. (Do not re-add!) [Valaris]
* Skill updates [celest]
* Added check for max vending_max_value when reading config [kobra_k88] * Added check for max vending_max_value when reading config [kobra_k88]
* Skill updates [celest] * Skill updates [celest]
- Napalm vulcan, Enchant Deadly Poison, Slow Poison (based on jAthena 1066) - Napalm vulcan, Enchant Deadly Poison, Slow Poison (based on jAthena 1066)

View File

@ -71,8 +71,8 @@ Assigned: N/A
Progess: 0% Progess: 0%
Problem: Monk's Skill ROOT instantly reboots server Problem: Monk's Skill ROOT instantly reboots server
Assigned: N/A Assigned: Celest
Progess: 0% Progess: 100%? (Notes: Typo... my bad, sorry ^^; )
Problem: Sage's Area Skills (Delu.,Vulcano, etc) if casted on the same area (or overlap each other) instantly reboots server. use @gvgon when test. Don't test it towns Problem: Sage's Area Skills (Delu.,Vulcano, etc) if casted on the same area (or overlap each other) instantly reboots server. use @gvgon when test. Don't test it towns
Assigned: N/A Assigned: N/A

View File

@ -2398,7 +2398,7 @@ static struct Damage battle_calc_mob_weapon_attack(
if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト
damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100; damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100;
if(sc_data[SC_BERSERK].timer!=-1) // バーサーク if(sc_data[SC_BERSERK].timer!=-1) // バーサーク
damage += damage*50/100; damage += damage*2;
} }
if(skill_num>0){ if(skill_num>0){
@ -2970,7 +2970,7 @@ static struct Damage battle_calc_pc_weapon_attack(
cri <<= 1; cri <<= 1;
} }
if(skill_num == SN_SHARPSHOOTING) if(skill_num == SN_SHARPSHOOTING && rand()%100 < 50)
cri += 200; cri += 200;
} }
@ -3091,8 +3091,8 @@ static struct Damage battle_calc_pc_weapon_attack(
damage2 += damage2*(2*sc_data[SC_TRUESIGHT].val1)/100; damage2 += damage2*(2*sc_data[SC_TRUESIGHT].val1)/100;
} }
if(sc_data[SC_BERSERK].timer!=-1){ // バーサーク if(sc_data[SC_BERSERK].timer!=-1){ // バーサーク
damage += damage*50/100; damage += damage*2;
damage2 += damage2*50/100; damage2 += damage2*2;
} }
} }
@ -4657,7 +4657,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
} }
} }
if(t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1){ if(t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1){
if (!(src->type = BL_MOB && mob_db[((struct mob_data *)src)->class].mode&0x32)) { if (!(src->type == BL_MOB && mob_db[((struct mob_data *)src)->class].mode&0x20)) {
int lv = t_sc_data[SC_BLADESTOP_WAIT].val1; int lv = t_sc_data[SC_BLADESTOP_WAIT].val1;
skill_status_change_end(target,SC_BLADESTOP_WAIT,-1); skill_status_change_end(target,SC_BLADESTOP_WAIT,-1);
skill_status_change_start(src,SC_BLADESTOP,lv,1,(int)src,(int)target,skill_get_time2(MO_BLADESTOP,lv),0); skill_status_change_start(src,SC_BLADESTOP,lv,1,(int)src,(int)target,skill_get_time2(MO_BLADESTOP,lv),0);
@ -4702,6 +4702,8 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
{ {
int s_p,s_g,t_p,t_g; int s_p,s_g,t_p,t_g;
struct block_list *ss=src; struct block_list *ss=src;
struct status_change *sc_data;
struct status_change *tsc_data;
nullpo_retr(0, src); nullpo_retr(0, src);
nullpo_retr(0, target); nullpo_retr(0, target);
@ -4726,6 +4728,13 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
if(target->type == BL_PC && ((struct map_session_data *)target)->invincible_timer != -1) if(target->type == BL_PC && ((struct map_session_data *)target)->invincible_timer != -1)
return -1; return -1;
// Celest
sc_data = battle_get_sc_data(src);
tsc_data = battle_get_sc_data(target);
if ((sc_data && sc_data[SC_BASILICA].timer != -1) ||
(tsc_data && tsc_data[SC_BASILICA].timer != -1))
return -1;
if(target->type == BL_SKILL) { if(target->type == BL_SKILL) {
switch(((struct skill_unit *)target)->group->unit_id){ switch(((struct skill_unit *)target)->group->unit_id){
case 0x8d: case 0x8d:

View File

@ -601,7 +601,7 @@ static int mob_attack(struct mob_data *md,unsigned int tick,int data)
md->state.targettype = NONE_ATTACKABLE; md->state.targettype = NONE_ATTACKABLE;
return 0; return 0;
} }
if(tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || if(tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || tsd->sc_data[SC_BASILICA].timer != -1 ||
((pc_ishiding(tsd) || tsd->state.gangsterparadise) && !((race == 4 || race == 6) && !tsd->perfect_hiding) ) ) ) { ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && !((race == 4 || race == 6) && !tsd->perfect_hiding) ) ) ) {
md->target_id=0; md->target_id=0;
md->state.targettype = NONE_ATTACKABLE; md->state.targettype = NONE_ATTACKABLE;
@ -1174,8 +1174,8 @@ int mob_target(struct mob_data *md,struct block_list *bl,int dist)
return 0; return 0;
if(mode&0x20 || // Coercion is exerted if it is MVPMOB. if(mode&0x20 || // Coercion is exerted if it is MVPMOB.
(sc_data && sc_data[SC_TRICKDEAD].timer == -1 && (sc_data && sc_data[SC_TRICKDEAD].timer == -1 && sc_data[SC_BASILICA].timer == -1 &&
( (option && !(*option&0x06) ) || race==4 || race==6) ) ){ ( (option && !(*option&0x06) ) || race==4 || race==6) ) ) {
if(bl->type == BL_PC) { if(bl->type == BL_PC) {
nullpo_retr(0, sd = (struct map_session_data *)bl); nullpo_retr(0, sd = (struct map_session_data *)bl);
if(sd->invincible_timer != -1 || pc_isinvisible(sd)) if(sd->invincible_timer != -1 || pc_isinvisible(sd))
@ -1240,7 +1240,7 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
) )
{ {
if(mode&0x20 || if(mode&0x20 ||
(tsd->sc_data[SC_TRICKDEAD].timer == -1 && (tsd->sc_data[SC_TRICKDEAD].timer == -1 && tsd->sc_data[SC_BASILICA].timer == -1 &&
((!pc_ishiding(tsd) && !tsd->state.gangsterparadise) || ((race == 4 || race == 6) && !tsd->perfect_hiding) ))){ // 妨害がないか判定 ((!pc_ishiding(tsd) && !tsd->state.gangsterparadise) || ((race == 4 || race == 6) && !tsd->perfect_hiding) ))){ // 妨害がないか判定
if( mob_can_reach(smd,bl,12) && // 到達可能性判定 if( mob_can_reach(smd,bl,12) && // 到達可能性判定
rand()%1000<1000/(++(*pcc)) ){ // 範囲内PCで等確率にする rand()%1000<1000/(++(*pcc)) ){ // 範囲内PCで等確率にする
@ -1428,7 +1428,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
race=mob_db[md->class].race; race=mob_db[md->class].race;
if(mode&0x20 || if(mode&0x20 ||
(sd->sc_data[SC_TRICKDEAD].timer == -1 && (sd->sc_data[SC_TRICKDEAD].timer == -1 && sd->sc_data[SC_BASILICA].timer == -1 &&
( (!pc_ishiding(sd) && !sd->state.gangsterparadise) || ((race == 4 || race == 6) && !sd->perfect_hiding) ) ) ){ // 妨害がないか判定 ( (!pc_ishiding(sd) && !sd->state.gangsterparadise) || ((race == 4 || race == 6) && !sd->perfect_hiding) ) ) ){ // 妨害がないか判定
md->target_id=sd->bl.id; md->target_id=sd->bl.id;
@ -1642,7 +1642,9 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
if(tsd || tmd) { if(tsd || tmd) {
if(tbl->m != md->bl.m || tbl->prev == NULL || (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase) if(tbl->m != md->bl.m || tbl->prev == NULL || (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase)
mob_unlocktarget(md,tick); // 別マップか、視界外 mob_unlocktarget(md,tick); // 別マップか、視界外
else if( tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && !((race == 4 || race == 6) && !tsd->perfect_hiding) )) ) else if( tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || tsd->sc_data[SC_BASILICA].timer != -1 ||
((pc_ishiding(tsd) || tsd->state.gangsterparadise) &&
!((race == 4 || race == 6) && !tsd->perfect_hiding) )) )
mob_unlocktarget(md,tick); // スキルなどによる策敵妨害 mob_unlocktarget(md,tick); // スキルなどによる策敵妨害
else if(!battle_check_range(&md->bl,tbl,mob_db[md->class].range)){ else if(!battle_check_range(&md->bl,tbl,mob_db[md->class].range)){
// 攻撃範囲外なので移動 // 攻撃範囲外なので移動

View File

@ -1452,9 +1452,9 @@ int pc_calcstatus(struct map_session_data* sd,int first)
sd->speed = sd->speed *125/100; sd->speed = sd->speed *125/100;
if(sd->sc_data[SC_CLOAKING].timer!=-1) { if(sd->sc_data[SC_CLOAKING].timer!=-1) {
sd->critical_rate += 100; // critical increases sd->critical_rate += 100; // critical increases
//sd->speed = sd->speed * (sd->sc_data[SC_CLOAKING].val3-sd->sc_data[SC_CLOAKING].val1*3) /100; sd->speed = sd->speed * (sd->sc_data[SC_CLOAKING].val3-sd->sc_data[SC_CLOAKING].val1*3) /100;
//clocking speed descreases normally // Ours is accurate enough - refer skill_check_cloaking. ^^
sd->speed = (sd->speed*(76+(sd->sc_data[SC_CLOAKING].val1*3)))/100; // Fixed by MiKa & Asa [Lupus] //sd->speed = (sd->speed*(76+(sd->sc_data[SC_CLOAKING].val1*3)))/100; // Fixed by MiKa & Asa [Lupus]
} }
//sd->speed = (sd->speed*(76+(sd->sc_data[SC_INCREASEAGI].val1*3)))/100; //sd->speed = (sd->speed*(76+(sd->sc_data[SC_INCREASEAGI].val1*3)))/100;
if(sd->sc_data[SC_CHASEWALK].timer!=-1) if(sd->sc_data[SC_CHASEWALK].timer!=-1)
@ -1696,10 +1696,10 @@ int pc_calcstatus(struct map_session_data* sd,int first)
sd->nhealsp = sd->nhealsp*sd->sprecov_rate/100; sd->nhealsp = sd->nhealsp*sd->sprecov_rate/100;
if(sd->nhealsp < 1) sd->nhealsp = 1; if(sd->nhealsp < 1) sd->nhealsp = 1;
} }
if((skill=pc_checkskill(sd,HP_MEDITATIO)) > 0) { // メディテイティオはSPRではなく自然回復にかかる /* if((skill=pc_checkskill(sd,HP_MEDITATIO)) > 0) { // f?fffBfefCfefBfI,I'SPR,A*,I',E`,¡©Z((c)¡®R¢¶n~.©«,E',(c),(c),e'
sd->nhealsp += 3*skill*(sd->status.max_sp)/100; sd->nhealsp += 3*skill*(sd->status.max_sp)/100;
if(sd->nhealsp > 0x7fff) sd->nhealsp = 0x7fff; if(sd->nhealsp > 0x7fff) sd->nhealsp = 0x7fff;
} } Increase natural SP regen instead of colossal SP Recovery effect [DracoRPG]*/
// 種族耐性(これでいいの? ディバインプロテクションと同じ?理がいるかも) // 種族耐性(これでいいの? ディバインプロテクションと同じ?理がいるかも)
if( (skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // ドラゴノロジ? if( (skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // ドラゴノロジ?
@ -1937,7 +1937,7 @@ int pc_calcstatus(struct map_session_data* sd,int first)
sd->mdef = sd->mdef2 = 0; sd->mdef = sd->mdef2 = 0;
sd->flee -= sd->flee*50/100; sd->flee -= sd->flee*50/100;
aspd_rate -= 30; aspd_rate -= 30;
sd->base_atk *= 3; //sd->base_atk *= 3;
} }
if(sd->sc_data[SC_KEEPING].timer!=-1) if(sd->sc_data[SC_KEEPING].timer!=-1)
sd->def = 100; sd->def = 100;
@ -6733,15 +6733,17 @@ struct map_session_data *pc_get_partner(struct map_session_data *sd)
static int natural_heal_tick,natural_heal_prev_tick,natural_heal_diff_tick; static int natural_heal_tick,natural_heal_prev_tick,natural_heal_diff_tick;
static int pc_spheal(struct map_session_data *sd) static int pc_spheal(struct map_session_data *sd)
{ {
int a; int a, skill;
struct guild_castle *gc = NULL; struct guild_castle *gc = NULL;
nullpo_retr(0, sd); nullpo_retr(0, sd);
a = natural_heal_diff_tick; a = natural_heal_diff_tick;
if(pc_issit(sd)) a += a; if(pc_issit(sd)) a += a;
if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // マグニフィカ?ト if (sd->sc_data[SC_MAGNIFICAT].timer!=-1) // ƒ}ƒOƒjƒtƒBƒJ?ƒg
a += a; a += a;
if((skill = pc_checkskill(sd,HP_MEDITATIO)) > 0) //Increase natural SP regen with Meditatio [DracoRPG]
a += a*skill*3/100;
gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris] gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris]
if(gc) { if(gc) {

View File

@ -2760,7 +2760,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
if (sd){ if (sd){
s_class = pc_calc_base_job(sd->status.class); s_class = pc_calc_base_job(sd->status.class);
if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // メディテイティオ if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // メディテイティオ
heal += heal*(skill*2/100); heal += heal*skill*2/100;
if(sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //自分も?象もPC、?象が自分のパ?トナ?、自分がスパノビ、自分が♀なら if(sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //自分も?象もPC、?象が自分のパ?トナ?、自分がスパノビ、自分が♀なら
heal = heal*2; //スパノビの嫁が旦那にヒ?ルすると2倍になる heal = heal*2; //スパノビの嫁が旦那にヒ?ルすると2倍になる
} }
@ -3479,7 +3479,29 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break; break;
case HP_BASILICA: /* バジリカ */ case HP_BASILICA: /* バジリカ */
skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0); {
// cancel Basilica if already in effect
struct status_change *sc_data = battle_get_sc_data(src);
if(sc_data && sc_data[SC_BASILICA].timer != -1){
struct skill_unit *su;
if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
struct skill_unit_group *sg;
if ((sg = su->group) && sg->src_id == sd->bl.id) {
skill_status_change_end(src,SC_BASILICA,-1);
skill_delunitgroup (sg);
break;
}
}
} else {
// otherwise allow casting
skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
skill_clear_unitgroup(src);
clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
}
}
break;
case PA_GOSPEL: /* ゴスペル */ case PA_GOSPEL: /* ゴスペル */
skill_clear_unitgroup(src); skill_clear_unitgroup(src);
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
@ -3673,22 +3695,22 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
struct status_change *tsc_data = battle_get_sc_data(bl); struct status_change *tsc_data = battle_get_sc_data(bl);
if(tsc_data && tsc_data[SC_CP_WEAPON].timer != -1 ) if(tsc_data && tsc_data[SC_CP_WEAPON].timer != -1 )
break; break;
strip_per = 5+2*skilllv+strip_fix/5; strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
if(rand()%100 < strip_per){ if(rand()%100 < strip_per){
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 ); skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
if(dstsd){ if(dstsd){
for(i=0;i<MAX_INVENTORY;i++){ for(i=0;i<MAX_INVENTORY;i++){
if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0002){ if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0002){
pc_unequipitem(dstsd,i,0,BF_SKILL); pc_unequipitem(dstsd,i,0,BF_SKILL);
break; break;
}
} }
} }
} }
} }
}
break; break;
case RG_STRIPSHIELD: /* ストリップシ?ルド */ case RG_STRIPSHIELD: /* ストリップシ?ルド */
@ -3696,22 +3718,22 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
struct status_change *tsc_data = battle_get_sc_data(bl); struct status_change *tsc_data = battle_get_sc_data(bl);
if(tsc_data && tsc_data[SC_CP_SHIELD].timer != -1 ) if(tsc_data && tsc_data[SC_CP_SHIELD].timer != -1 )
break; break;
strip_per = 5+2*skilllv+strip_fix/5; strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
if(rand()%100 < strip_per){ if(rand()%100 < strip_per){
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 ); skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
if(dstsd){ if(dstsd){
for(i=0;i<MAX_INVENTORY;i++){ for(i=0;i<MAX_INVENTORY;i++){
if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0020){ if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0020){
pc_unequipitem(dstsd,i,0,BF_SKILL); pc_unequipitem(dstsd,i,0,BF_SKILL);
break; break;
}
} }
} }
} }
} }
}
break; break;
case RG_STRIPARMOR: /* ストリップア?マ? */ case RG_STRIPARMOR: /* ストリップア?マ? */
@ -3719,44 +3741,44 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
struct status_change *tsc_data = battle_get_sc_data(bl); struct status_change *tsc_data = battle_get_sc_data(bl);
if(tsc_data && tsc_data[SC_CP_ARMOR].timer != -1 ) if(tsc_data && tsc_data[SC_CP_ARMOR].timer != -1 )
break; break;
strip_per = 5+2*skilllv+strip_fix/5; strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
if(rand()%100 < strip_per){ if(rand()%100 < strip_per){
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 ); skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
if(dstsd){ if(dstsd){
for(i=0;i<MAX_INVENTORY;i++){ for(i=0;i<MAX_INVENTORY;i++){
if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0010){ if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0010){
pc_unequipitem(dstsd,i,0,BF_SKILL); pc_unequipitem(dstsd,i,0,BF_SKILL);
break; break;
}
} }
} }
} }
} }
}
break; break;
case RG_STRIPHELM: /* ストリップヘルム */ case RG_STRIPHELM: /* ストリップヘルム */
{ {
struct status_change *tsc_data = battle_get_sc_data(bl); struct status_change *tsc_data = battle_get_sc_data(bl);
if(tsc_data && tsc_data[SC_CP_HELM].timer != -1 ) if(tsc_data && tsc_data[SC_CP_HELM].timer != -1 )
break; break;
strip_per = 5+2*skilllv+strip_fix/5; strip_per = 5+2*skilllv+strip_fix/5;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
if(rand()%100 < strip_per){ if(rand()%100 < strip_per){
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 ); skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
if(dstsd){ if(dstsd){
for(i=0;i<MAX_INVENTORY;i++){ for(i=0;i<MAX_INVENTORY;i++){
if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0100){ if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0100){
pc_unequipitem(dstsd,i,0,BF_SKILL); pc_unequipitem(dstsd,i,0,BF_SKILL);
break; break;
}
} }
} }
} }
} }
}
break; break;
/* PotionPitcher */ /* PotionPitcher */
case AM_POTIONPITCHER: /* ポ?ションピッチャ? */ case AM_POTIONPITCHER: /* ポ?ションピッチャ? */
@ -6770,14 +6792,18 @@ int skill_use_id( struct map_session_data *sd, int target_id,
if (skill_num == sd->sc_data[SC_BLOCKSKILL].val3) if (skill_num == sd->sc_data[SC_BLOCKSKILL].val3)
return 0; return 0;
if (sc_data[SC_BASILICA].timer != -1) { // Basilica cancels if caster moves [celest] if (sc_data[SC_BASILICA].timer != -1) { // Disallow all other skills in Basilica [celest]
struct skill_unit *su; struct skill_unit *su;
if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) { if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
struct skill_unit_group *sg; struct skill_unit_group *sg;
// if caster is the owner of basilica
if ((sg = su->group) && sg->src_id == sd->bl.id) { if ((sg = su->group) && sg->src_id == sd->bl.id) {
skill_status_change_end(&sd->bl,SC_BASILICA,-1); // skill_status_change_end(&sd->bl,SC_BASILICA,-1);
skill_delunitgroup (sg); // skill_delunitgroup (sg);
} if (skill_num != HP_BASILICA) return 0;
} // otherwise...
else
return 0;
} }
} }
} }
@ -7073,10 +7099,14 @@ int skill_use_pos( struct map_session_data *sd,
struct skill_unit *su; struct skill_unit *su;
if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) { if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
struct skill_unit_group *sg; struct skill_unit_group *sg;
// if caster is the owner of basilica
if ((sg = su->group) && sg->src_id == sd->bl.id) { if ((sg = su->group) && sg->src_id == sd->bl.id) {
skill_status_change_end(&sd->bl,SC_BASILICA,-1); // skill_status_change_end(&sd->bl,SC_BASILICA,-1);
skill_delunitgroup (sg); // skill_delunitgroup (sg);
} if (skill_num != HP_BASILICA) return 0;
} // otherwise...
else
return 0;
} }
} }
} }
@ -9504,44 +9534,44 @@ void skill_stop_dancing(struct block_list *src, int flag)
nullpo_retv(src); nullpo_retv(src);
sc_data=battle_get_sc_data(src); sc_data=battle_get_sc_data(src);
if(sc_data && sc_data[SC_DANCING].timer==-1) if(sc_data && sc_data[SC_DANCING].timer != -1) {
return; group=(struct skill_unit_group *)sc_data[SC_DANCING].val2; //ダンスのスキルユニットIDはval2に入ってる
group=(struct skill_unit_group *)sc_data[SC_DANCING].val2; //ダンスのスキルユニットIDはval2に入ってる if(group && src->type==BL_PC && sc_data && sc_data[SC_DANCING].val4){ //合奏中?
if(group && src->type==BL_PC && sc_data && sc_data[SC_DANCING].val4){ //合奏中? struct map_session_data* dsd=map_id2sd(sc_data[SC_DANCING].val4); //相方のsd取得
struct map_session_data* dsd=map_id2sd(sc_data[SC_DANCING].val4); //相方のsd取得 if(flag){ //ログアウトなど片方が落ちても演奏が??される
if(flag){ //ログアウトなど片方が落ちても演奏が??される if(dsd && src->id == group->src_id){ //グル?プを持ってるPCが落ちる
if(dsd && src->id == group->src_id){ //グル?プを持ってるPCが落ちる group->src_id=sc_data[SC_DANCING].val4; //相方にグル?プを任せる
group->src_id=sc_data[SC_DANCING].val4; //相方にグル?プを任せる if(flag&1) //ログアウト
if(flag&1) //ログアウト dsd->sc_data[SC_DANCING].val4=0; //相方の相方を0にして合奏終了→通常のダンス?態
dsd->sc_data[SC_DANCING].val4=0; //相方の相方を0にして合奏終了→通常のダンス?態 if(flag&2) //ハエ飛びなど
if(flag&2) //ハエ飛びなど return; //合奏もダンス?態も終了させない&スキルユニットは置いてけぼり
return; //合奏もダンス?態も終了させない&スキルユニットは置いてけぼり }else if(dsd && dsd->bl.id == group->src_id){ //相方がグル?プを持っているPCが落ちる(自分はグル?プを持っていない)
}else if(dsd && dsd->bl.id == group->src_id){ //相方がグル?プを持っているPCが落ちる(自分はグル?プを持っていない) if(flag&1) //ログアウト
if(flag&1) //ログアウト dsd->sc_data[SC_DANCING].val4=0; //相方の相方を0にして合奏終了→通常のダンス?態
dsd->sc_data[SC_DANCING].val4=0; //相方の相方を0にして合奏終了→通常のダンス?態 if(flag&2) //ハエ飛びなど
if(flag&2) //ハエ飛びなど return; //合奏もダンス?態も終了させない&スキルユニットは置いてけぼり
return; //合奏もダンス?態も終了させない&スキルユニットは置いてけぼり }
}
skill_status_change_end(src,SC_DANCING,-1);//自分のステ?タスを終了させる
//そしてグル?プは消さない&消さないのでステ?タス計算もいらない?
return;
}else{
if(dsd && src->id == group->src_id){ //グル?プを持ってるPCが止める
skill_status_change_end((struct block_list *)dsd,SC_DANCING,-1);//相手のステ?タスを終了させる
}
if(dsd && dsd->bl.id == group->src_id){ //相方がグル?プを持っているPCが止める(自分はグル?プを持っていない)
skill_status_change_end(src,SC_DANCING,-1);//自分のステ?タスを終了させる skill_status_change_end(src,SC_DANCING,-1);//自分のステ?タスを終了させる
//そしてグル?プは消さない&消さないのでステ?タス計算もいらない?
return;
}else{
if(dsd && src->id == group->src_id){ //グル?プを持ってるPCが止める
skill_status_change_end((struct block_list *)dsd,SC_DANCING,-1);//相手のステ?タスを終了させる
}
if(dsd && dsd->bl.id == group->src_id){ //相方がグル?プを持っているPCが止める(自分はグル?プを持っていない)
skill_status_change_end(src,SC_DANCING,-1);//自分のステ?タスを終了させる
}
} }
} }
if(flag&2 && group && src->type==BL_PC){ //ハエで飛んだときとかはユニットも飛ぶ
struct map_session_data *sd = (struct map_session_data *)src;
skill_unit_move_unit_group(group, sd->bl.m,(sd->to_x - sd->bl.x),(sd->to_y - sd->bl.y));
return;
}
skill_delunitgroup(group);
if(src->type==BL_PC)
pc_calcstatus((struct map_session_data *)src,0);
} }
if(flag&2 && group && src->type==BL_PC){ //ハエで飛んだときとかはユニットも飛ぶ
struct map_session_data *sd = (struct map_session_data *)src;
skill_unit_move_unit_group(group, sd->bl.m,(sd->to_x - sd->bl.x),(sd->to_y - sd->bl.y));
return;
}
skill_delunitgroup(group);
if(src->type==BL_PC)
pc_calcstatus((struct map_session_data *)src,0);
} }
/*========================================== /*==========================================