- 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:
parent
0be79fa569
commit
20ee33f1bc
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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)){
|
||||||
// 攻撃範囲外なので移動
|
// 攻撃範囲外なので移動
|
||||||
|
20
src/map/pc.c
20
src/map/pc.c
@ -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) {
|
||||||
|
212
src/map/skill.c
212
src/map/skill.c
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
|
Loading…
x
Reference in New Issue
Block a user