- The rate passed to status_change_start must now be in 0->10000 range.
- Added macros sc_start and sc_start4 to simplify invocation of status_change_start. - Cleaned the active guild skills, requirements moved to skill_check_require, should now be usable by non-players as well (pets/mobs). - Updated skill_cast_db time info. Magnum's time2 is skill-block time, St. Recovery/ Cure's time2 is the confuse/blind duration, added NPC_POWERUP/NPC_AGIUP durations, Napalm Vulcan's time2 is curse length, and most of Tarot Card's effects last time2 as well. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5454 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
389c773fd2
commit
db973e2998
@ -5,6 +5,11 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EV
|
||||
GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
|
||||
|
||||
2006/03/03
|
||||
* status_change_start now checks on a 0->10000 scale, should fix sc-cards
|
||||
with very low rates never triggering (eg: some coma-inducing cards).
|
||||
[Skotlex]
|
||||
* Cleaned up the active guild skills. They should be usable now by
|
||||
non-players as well. [Skotlex]
|
||||
* Fixed crash on the NPC whisper system when the message's size was 1.
|
||||
[Skotlex]
|
||||
* Strip status changes are now removed on logout. [Skotlex]
|
||||
|
@ -26,6 +26,13 @@
|
||||
|
||||
=========================
|
||||
|
||||
03/03
|
||||
* Updated skill_cast_db time info for some skills: [Skotlex]
|
||||
- Magnum's time2 is skill-block time
|
||||
- St. Recovery/ Cure's time2 is the confuse/blind duration
|
||||
- added NPC_POWERUP/NPC_AGIUP durations
|
||||
- Napalm Vulcan's time2 is curse length
|
||||
- Most of Tarot Card's effects last time2
|
||||
* Adjusted SC durations for Meteor Assault [Skotlex]
|
||||
03/02
|
||||
* Temp Plugs for NJ and GS items [Poki#3]
|
||||
|
@ -36,7 +36,7 @@
|
||||
//-- SM_MAGNUM
|
||||
7,0,0,0,2000,10000
|
||||
//-- SM_ENDURE
|
||||
8,0,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,0
|
||||
8,0,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,10000
|
||||
//==========================================
|
||||
|
||||
|
||||
@ -92,7 +92,7 @@
|
||||
//-- AL_BLESSING
|
||||
34,0,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
|
||||
//-- AL_CURE
|
||||
35,0,1000,0,0,0
|
||||
35,0,1000,0,0,6000
|
||||
//==========================================
|
||||
|
||||
|
||||
@ -149,7 +149,7 @@
|
||||
//-- PR_SLOWPOISON
|
||||
71,0,0,0,10000:20000:30000:40000,0
|
||||
//-- PR_STRECOVERY
|
||||
72,0,2000,0,0,0
|
||||
72,0,2000,0,0,30000
|
||||
//-- PR_KYRIE
|
||||
73,2000,2000,0,120000,0
|
||||
//-- PR_MAGNIFICAT
|
||||
@ -508,6 +508,10 @@
|
||||
339,2000,1500,0,900,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
|
||||
//-- NPC_STOP
|
||||
340,0,0,0,10000,0
|
||||
//-- NPC_POWERUP
|
||||
349,0,0,0,60000:120000:180000:240000:300000,0
|
||||
//-- NPC_AGIUP
|
||||
350,0,0,0,60000:120000:180000:240000:300000,0
|
||||
//==========================================
|
||||
|
||||
|
||||
@ -627,7 +631,7 @@
|
||||
//-- LK_JOINTBEAT
|
||||
399,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,30000
|
||||
//-- HW_NAPALMVULCAN
|
||||
400,1700,1000,0,0,0,0
|
||||
400,1700,1000,0,0,0,45000
|
||||
//-- CH_SOULCOLLECT
|
||||
401,2000,0,0,600000,0
|
||||
//-- PF_MINDBREAKER
|
||||
@ -779,7 +783,7 @@
|
||||
//-- CG_HERMODE
|
||||
488,0,0,0,10000:15000:20000:25000:30000,10000:15000:20000:25000:30000
|
||||
//-- CG_TAROTCARD
|
||||
489,1000,3000,0,0,0
|
||||
489,1000,3000,0,0,30000
|
||||
//-- CR_ACIDDEMONSTRATION
|
||||
490,1000,1000,0,0,0
|
||||
//==========================================
|
||||
|
@ -8383,7 +8383,7 @@ int atcommand_mute(
|
||||
clif_GM_silence(sd, pl_sd, 0);
|
||||
pl_sd->status.manner -= manner;
|
||||
if(pl_sd->status.manner < 0)
|
||||
status_change_start(&pl_sd->bl,SC_NOCHAT,100,0,0,0,0,0,0);
|
||||
sc_start(&pl_sd->bl,SC_NOCHAT,100,0,0);
|
||||
}
|
||||
else {
|
||||
clif_displaymessage(fd, msg_table[3]); // Character not found.
|
||||
@ -9478,7 +9478,7 @@ static int atcommand_mutearea_sub(struct block_list *bl,va_list ap)
|
||||
if (id != bl->id && !pc_isGM(pl_sd)) {
|
||||
pl_sd->status.manner -= time;
|
||||
if (pl_sd->status.manner < 0)
|
||||
status_change_start(&pl_sd->bl,SC_NOCHAT,100,0,0,0,0,0,0);
|
||||
sc_start(&pl_sd->bl,SC_NOCHAT,100,0,0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -604,7 +604,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
|
||||
if (sd && pc_issit(sd)) pc_setstand(sd); //Stand it to dodge.
|
||||
clif_skill_nodamage(bl,bl,TK_DODGE,1,1);
|
||||
if (sc->data[SC_COMBO].timer == -1)
|
||||
status_change_start(bl, SC_COMBO, 100, TK_JUMPKICK, src->id, 0, 0, 2000, 0);
|
||||
sc_start4(bl, SC_COMBO, 100, TK_JUMPKICK, src->id, 0, 0, 2000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3041,9 +3041,9 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
|
||||
int duration = skill_get_time2(MO_BLADESTOP,skilllv);
|
||||
status_change_end(target, SC_BLADESTOP_WAIT, -1);
|
||||
clif_damage(src, target, tick, status_get_amotion(src), 1, 0, 1, 0, 0); //Display MISS.
|
||||
status_change_start(target, SC_BLADESTOP, 100, skilllv, 2, (int)target, (int)src, duration, 0);
|
||||
sc_start4(target, SC_BLADESTOP, 100, skilllv, 2, (int)target, (int)src, duration);
|
||||
skilllv = sd?pc_checkskill(sd, MO_BLADESTOP):1;
|
||||
status_change_start(src, SC_BLADESTOP, 100, skilllv, 1, (int)src, (int)target, duration, 0);
|
||||
sc_start4(src, SC_BLADESTOP, 100, skilllv, 1, (int)src, (int)target, duration);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3098,7 +3098,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
|
||||
if (sd->weapon_coma_race[boss?10:11] > 0)
|
||||
rate += sd->weapon_coma_race[boss?10:11];
|
||||
if (rate)
|
||||
status_change_start(target, SC_COMA, rate/100, 0, 0, 0, 0, 0, 0);
|
||||
status_change_start(target, SC_COMA, rate, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -467,7 +467,7 @@ int charsave_load_scdata(int account_id, int char_id)
|
||||
continue;
|
||||
}
|
||||
|
||||
status_change_start(&sd->bl, atoi(sql_row[0]), 100, atoi(sql_row[2]), atoi(sql_row[3]),
|
||||
status_change_start(&sd->bl, atoi(sql_row[0]), 10000, atoi(sql_row[2]), atoi(sql_row[3]),
|
||||
atoi(sql_row[4]), atoi(sql_row[5]), atoi(sql_row[1]), 15);
|
||||
}
|
||||
}
|
||||
|
@ -1227,7 +1227,7 @@ int chrif_load_scdata(int fd)
|
||||
ShowWarning("chrif_load_scdata: Received invalid duration (%d ms) for status change %d (character %s)\n", data.tick, data.type, sd->status.name);
|
||||
continue;
|
||||
}
|
||||
status_change_start(&sd->bl, data.type, 100, data.val1, data.val2, data.val3, data.val4, data.tick, 15);
|
||||
status_change_start(&sd->bl, data.type, 10000, data.val1, data.val2, data.val3, data.val4, data.tick, 15);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
|
@ -8823,7 +8823,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
||||
clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color);
|
||||
|
||||
if(battle_config.muting_players && sd->status.manner < 0 && battle_config.manner_system)
|
||||
status_change_start(&sd->bl,SC_NOCHAT,100,0,0,0,0,0,0);
|
||||
sc_start(&sd->bl,SC_NOCHAT,100,0,0);
|
||||
|
||||
// Lance
|
||||
if (script_config.event_script_type == 0) {
|
||||
@ -8836,34 +8836,6 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
||||
ShowStatus("%d '"CL_WHITE"%s"CL_RESET"' events executed.\n",
|
||||
npc_event_doall_id(script_config.loadmap_event_name, sd->bl.id), script_config.loadmap_event_name);
|
||||
}
|
||||
/* These should not be needed anymore. [Skotlex]
|
||||
* - the option is sent on every player packet, why send it?
|
||||
* - There should be no need to do a signum check on map change, it is done on equipment change.
|
||||
* - Trick-dead is finished on pc_setpos
|
||||
* - Night effect is handled on clif_spawnpc
|
||||
// option
|
||||
clif_changeoption(&sd->bl);
|
||||
if(sd->sc_data[SC_TRICKDEAD].timer != -1)
|
||||
status_change_end(&sd->bl,SC_TRICKDEAD,-1);
|
||||
if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
|
||||
status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
|
||||
if(sd->special_state.infinite_endure && sd->sc_data[SC_ENDURE].timer == -1)
|
||||
status_change_start(&sd->bl,SC_ENDURE,100,10,1,0,0,0,0);
|
||||
|
||||
// Required to eliminate glow bugs because it's executed before clif_changeoption [Lance]
|
||||
//New 'night' effect by dynamix [Skotlex]
|
||||
if (night_flag && map[sd->bl.m].flag.nightenabled)
|
||||
{ //Display night.
|
||||
if (sd->state.night) //It must be resent because otherwise players get this annoying aura...
|
||||
clif_status_load(&sd->bl, SI_NIGHT, 0);
|
||||
else
|
||||
sd->state.night = 1;
|
||||
clif_status_load(&sd->bl, SI_NIGHT, 1);
|
||||
} else if (sd->state.night) { //Clear night display.
|
||||
clif_status_load(&sd->bl, SI_NIGHT, 0);
|
||||
sd->state.night = 0;
|
||||
}
|
||||
*/
|
||||
if (pc_checkskill(sd,SG_KNOWLEDGE) ||
|
||||
pc_checkskill(sd,SG_SUN_COMFORT) ||
|
||||
pc_checkskill(sd,SG_MOON_COMFORT) ||
|
||||
@ -9161,8 +9133,8 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <
|
||||
if (skillnotok(MO_EXPLOSIONSPIRITS,sd))
|
||||
break; //Do not override the noskill mapflag. [Skotlex]
|
||||
clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,-1,
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],100,
|
||||
17,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,1),0 )); //Lv17-> +50 critical (noted by Poki) [Skotlex]
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],100,
|
||||
17,skill_get_time(MO_EXPLOSIONSPIRITS,1))); //Lv17-> +50 critical (noted by Poki) [Skotlex]
|
||||
sd->state.snovice_flag = 0;
|
||||
break;
|
||||
}
|
||||
@ -11103,7 +11075,7 @@ void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd)
|
||||
{
|
||||
dstsd->status.manner -= limit;
|
||||
if(dstsd->status.manner < 0)
|
||||
status_change_start(bl,SC_NOCHAT,100,0,0,0,0,0,0);
|
||||
sc_start(bl,SC_NOCHAT,100,0,0);
|
||||
else
|
||||
{
|
||||
dstsd->status.manner = 0;
|
||||
@ -11300,7 +11272,7 @@ void clif_parse_NoviceDoriDori(int fd, struct map_session_data *sd) {
|
||||
sd->doridori_counter = 1;
|
||||
if ((sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON
|
||||
&& sd->state.rest && (level = pc_checkskill(sd,TK_SPTIME)))
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[TK_SPTIME],100,level,0,0,0,skill_get_time(TK_SPTIME, level),0);
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[TK_SPTIME],100,level,skill_get_time(TK_SPTIME, level));
|
||||
return;
|
||||
}
|
||||
/*==========================================
|
||||
@ -11319,8 +11291,8 @@ void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd)
|
||||
}
|
||||
if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.base_exp > 0 && nextbaseexp > 0 && (int)((double)1000*sd->status.base_exp/nextbaseexp)%100==0){
|
||||
clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,5,
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],100,
|
||||
5,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,5),0));
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],100,
|
||||
5,skill_get_time(MO_EXPLOSIONSPIRITS,5)));
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
@ -582,7 +582,7 @@ int party_skill_check(struct map_session_data *sd, int party_id, int skillid, in
|
||||
&& sd->bl.m == p_sd->bl.m
|
||||
&& pc_checkskill(p_sd,MO_TRIPLEATTACK)) {
|
||||
int rate = 50 +50*skilllv; //+100/150/200% success rate
|
||||
status_change_start(&p_sd->bl,SC_SKILLRATE_UP,100,MO_TRIPLEATTACK,rate,0,0,skill_get_time(SG_FRIEND, 1),0);
|
||||
sc_start4(&p_sd->bl,SC_SKILLRATE_UP,100,MO_TRIPLEATTACK,rate,0,0,skill_get_time(SG_FRIEND, 1));
|
||||
}
|
||||
break;
|
||||
case MO_TRIPLEATTACK: //Increase Counter rate of Star Gladiators
|
||||
@ -590,7 +590,7 @@ int party_skill_check(struct map_session_data *sd, int party_id, int skillid, in
|
||||
&& sd->bl.m == p_sd->bl.m
|
||||
&& pc_checkskill(p_sd,TK_COUNTER)) {
|
||||
int rate = 50 +50*pc_checkskill(p_sd,TK_COUNTER); //+100/150/200% success rate
|
||||
status_change_start(&p_sd->bl,SC_SKILLRATE_UP,100,TK_COUNTER,rate,0,0,skill_get_time(SG_FRIEND, 1),0);
|
||||
sc_start4(&p_sd->bl,SC_SKILLRATE_UP,100,TK_COUNTER,rate,0,0,skill_get_time(SG_FRIEND, 1));
|
||||
}
|
||||
break;
|
||||
case AM_TWILIGHT2: //Twilight Pharmacy, requires Super Novice
|
||||
|
29
src/map/pc.c
29
src/map/pc.c
@ -307,7 +307,7 @@ int pc_setrestartvalue(struct map_session_data *sd,int type) {
|
||||
sd->status.sp=sd->status.max_sp;
|
||||
if (sd->state.snovice_flag == 4) {
|
||||
sd->state.snovice_flag = 0;
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],100,1,0,0,0,skill_get_time(MO_STEELBODY,1),0 );
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],100,1,skill_get_time(MO_STEELBODY,1));
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -846,7 +846,7 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
|
||||
}
|
||||
|
||||
if(sd->status.manner < 0) //Needed or manner will always be negative.
|
||||
status_change_start(&sd->bl,SC_NOCHAT,100,0,0,0,0,0,0);
|
||||
sc_start(&sd->bl,SC_NOCHAT,100,0,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1113,14 +1113,14 @@ int pc_checkweighticon(struct map_session_data *sd)
|
||||
|
||||
if(flag==1){
|
||||
if(sd->sc.data[SC_WEIGHT50].timer==-1)
|
||||
status_change_start(&sd->bl,SC_WEIGHT50,100,0,0,0,0,0,1);
|
||||
sc_start(&sd->bl,SC_WEIGHT50,100,0,0);
|
||||
}else{
|
||||
if(sd->sc.data[SC_WEIGHT50].timer!=-1)
|
||||
status_change_end(&sd->bl,SC_WEIGHT50,-1);
|
||||
}
|
||||
if(flag==2){
|
||||
if(sd->sc.data[SC_WEIGHT90].timer==-1)
|
||||
status_change_start(&sd->bl,SC_WEIGHT90,100,0,0,0,0,0,1);
|
||||
sc_start(&sd->bl,SC_WEIGHT90,100,0,0);
|
||||
}else{
|
||||
if(sd->sc.data[SC_WEIGHT90].timer!=-1)
|
||||
status_change_end(&sd->bl,SC_WEIGHT90,-1);
|
||||
@ -3609,8 +3609,7 @@ int pc_walktoxy (struct map_session_data *sd, int x, int y)
|
||||
if (sd->sc.data && sd->sc.data[SC_MIRACLE].timer==-1 && ((sd->status.class_==JOB_STAR_GLADIATOR) || (sd->status.class_==JOB_STAR_GLADIATOR2)) && (rand()%10000 < battle_config.sg_miracle_skill_ratio) )
|
||||
{
|
||||
clif_displaymessage(sd->fd,"[Miracle of the Sun, Moon and Stars]");
|
||||
status_change_start(&sd->bl,SC_MIRACLE,100,
|
||||
1,0,0,0,battle_config.sg_miracle_skill_duration,0);
|
||||
sc_start(&sd->bl,SC_MIRACLE,100,1,battle_config.sg_miracle_skill_duration);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -4513,11 +4512,11 @@ int pc_checkbaselevelup(struct map_session_data *sd)
|
||||
|
||||
//スパノビはキリエ、イムポ、マニピ、グロ、サフラLv1がかかる
|
||||
if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE || (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON){
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],100,1,0,0,0,skill_get_time(PR_KYRIE,1),0 );
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[PR_IMPOSITIO],100,1,0,0,0,skill_get_time(PR_IMPOSITIO,1),0 );
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],100,1,0,0,0,skill_get_time(PR_MAGNIFICAT,1),0 );
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[PR_GLORIA],100,1,0,0,0,skill_get_time(PR_GLORIA,1),0 );
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[PR_SUFFRAGIUM],100,1,0,0,0,skill_get_time(PR_SUFFRAGIUM,1),0 );
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],100,1,skill_get_time(PR_KYRIE,1));
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[PR_IMPOSITIO],100,1,skill_get_time(PR_IMPOSITIO,1));
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],100,1,skill_get_time(PR_MAGNIFICAT,1));
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[PR_GLORIA],100,1,skill_get_time(PR_GLORIA,1));
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[PR_SUFFRAGIUM],100,1,skill_get_time(PR_SUFFRAGIUM,1));
|
||||
}
|
||||
|
||||
clif_misceffect(&sd->bl,0);
|
||||
@ -5270,7 +5269,7 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
|
||||
if(sd->status.hp<sd->status.max_hp>>2 && sd->sc.data[SC_AUTOBERSERK].timer != -1 &&
|
||||
(sd->sc.data[SC_PROVOKE].timer==-1 || sd->sc.data[SC_PROVOKE].val2==0 ))
|
||||
// オ?トバ?サ?ク?動
|
||||
status_change_start(&sd->bl,SC_PROVOKE,100,10,1,0,0,0,0);
|
||||
sc_start4(&sd->bl,SC_PROVOKE,100,10,1,0,0,0);
|
||||
|
||||
sd->canlog_tick = gettick();
|
||||
|
||||
@ -5329,7 +5328,7 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
|
||||
if (battle_config.pk_mode && ssd->status.manner >= 0 && battle_config.manner_system) {
|
||||
ssd->status.manner -= 5;
|
||||
if(ssd->status.manner < 0)
|
||||
status_change_start(src,SC_NOCHAT,100,0,0,0,0,0,0);
|
||||
sc_start(src,SC_NOCHAT,100,0,0);
|
||||
|
||||
// PK/Karma system code (not enabled yet) [celest]
|
||||
// originally from Kade Online, so i don't know if any of these is correct ^^;
|
||||
@ -5585,9 +5584,9 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
|
||||
if(battle_config.pc_invincible_time)
|
||||
pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
|
||||
if (resurrect_flag)
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],100,10,0,0,0,skill_get_time2(SL_KAIZEL, resurrect_flag),0);
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],100,10,skill_get_time2(SL_KAIZEL, resurrect_flag));
|
||||
else
|
||||
status_change_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],100,1,0,0,0,skill_get_time(MO_STEELBODY,1),0 );
|
||||
sc_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],100,1,skill_get_time(MO_STEELBODY,1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -6082,7 +6082,7 @@ int buildin_sc_start(struct script_state *st)
|
||||
val4 = 1; //Mark that this was a thrown sc_effect
|
||||
}
|
||||
if (bl)
|
||||
status_change_start(bl,type,100,val1,0,0,val4,tick,0);
|
||||
sc_start4(bl,type,100,val1,0,0,val4,tick);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -6110,7 +6110,7 @@ int buildin_sc_start2(struct script_state *st)
|
||||
}
|
||||
|
||||
if(bl)
|
||||
status_change_start(bl,type,per/100,val1,0,0,val4,tick,0);
|
||||
status_change_start(bl,type,per,val1,0,0,val4,tick,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -6140,7 +6140,7 @@ int buildin_sc_start4(struct script_state *st)
|
||||
tick/=2;
|
||||
}
|
||||
if (bl)
|
||||
status_change_start(bl,type,100,val1,val2,val3,val4,tick,0);
|
||||
sc_start4(bl,type,100,val1,val2,val3,val4,tick);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
661
src/map/skill.c
661
src/map/skill.c
File diff suppressed because it is too large
Load Diff
@ -1630,11 +1630,6 @@ int status_calc_pc(struct map_session_data* sd,int first)
|
||||
if(b_sp != sd->status.sp)
|
||||
clif_updatestatus(sd,SP_SP);
|
||||
|
||||
/* I don't think there's a need for this here. It should be handled in pc_damage and pc_heal. [Skotlex]
|
||||
if(sd->status.hp<sd->status.max_hp>>2 && sd->sc.data[SC_AUTOBERSERK].timer!=-1 &&
|
||||
(sd->sc.data[SC_PROVOKE].timer==-1 || sd->sc.data[SC_PROVOKE].val2==0) && !pc_isdead(sd))
|
||||
status_change_start(&sd->bl,SC_PROVOKE,100,10,1,0,0,0,0);
|
||||
*/
|
||||
calculating = 0;
|
||||
return 0;
|
||||
}
|
||||
@ -3435,7 +3430,7 @@ int status_get_sc_tick(struct block_list *bl, int type, int tick)
|
||||
/*==========================================
|
||||
* Starts a status change.
|
||||
* type = type, val1~4 depend on the type.
|
||||
* rate = base success rate. 100 = 100%
|
||||
* rate = base success rate. 10000 = 100%
|
||||
* Tick is base duration
|
||||
* flag:
|
||||
* &1: Cannot be avoided (it has to start)
|
||||
@ -3475,7 +3470,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
|
||||
|
||||
//Check rate
|
||||
if (!(flag&(4|1))) {
|
||||
rate*=100; //Pass to 10000 = 100%
|
||||
if (rate > 10000) //Shouldn't let this go above 100%
|
||||
rate = 10000;
|
||||
race = flag&8?0:status_get_sc_def(bl, type); //recycling race to store the sc_def value.
|
||||
@ -3657,7 +3651,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
|
||||
tick = 60*1000;
|
||||
if (sd && sd->status.hp<sd->status.max_hp>>2 &&
|
||||
(sc->data[SC_PROVOKE].timer==-1 || sc->data[SC_PROVOKE].val2==0))
|
||||
status_change_start(bl,SC_PROVOKE,10,100,1,0,0,0,0);
|
||||
sc_start4(bl,SC_PROVOKE,100,10,1,0,0,0);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -4036,7 +4030,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
|
||||
for (i = 0; i < 5; i++)
|
||||
{ //Pass the status to the other affected chars. [Skotlex]
|
||||
if (sd->devotion[i] && (tsd = map_id2sd(sd->devotion[i])))
|
||||
status_change_start(&tsd->bl,SC_AUTOGUARD,100,val1,val2,0,0,tick,1);
|
||||
status_change_start(&tsd->bl,SC_AUTOGUARD,10000,val1,val2,0,0,tick,1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -4052,7 +4046,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
|
||||
for (i = 0; i < 5; i++)
|
||||
{ //See if there are devoted characters, and pass the status to them. [Skotlex]
|
||||
if (sd->devotion[i] && (tsd = map_id2sd(sd->devotion[i])))
|
||||
status_change_start(&tsd->bl,SC_DEFENDER,100,val1,val2,0,0,tick,1);
|
||||
status_change_start(&tsd->bl,SC_DEFENDER,10000,val1,val2,0,0,tick,1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -4077,7 +4071,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
|
||||
case SC_JOINTBEAT: // Random break [DracoRPG]
|
||||
calc_flag = 1;
|
||||
val2 = rand()%6;
|
||||
if (val2 == 5) status_change_start(bl,SC_BLEEDING,100,val1,0,0,0,skill_get_time2(StatusSkillChangeTable[type],val1),0);
|
||||
if (val2 == 5) sc_start(bl,SC_BLEEDING,100,val1,skill_get_time2(StatusSkillChangeTable[type],val1));
|
||||
break;
|
||||
|
||||
case SC_BERSERK: /* ƒo?ƒT?ƒN */
|
||||
@ -4186,14 +4180,10 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
|
||||
//once the Crusader's status changes, it will reflect on the others.
|
||||
int type2 = SC_AUTOGUARD;
|
||||
if (src->sc.data[type2].timer != -1)
|
||||
status_change_start(bl,type2,100,
|
||||
src->sc.data[type2].val1,0,0,0,
|
||||
skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1),0);
|
||||
sc_start(bl,type2,100,src->sc.data[type2].val1,skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1));
|
||||
type2 = SC_DEFENDER;
|
||||
if (src->sc.data[type2].timer != -1)
|
||||
status_change_start(bl,type2,100,
|
||||
src->sc.data[type2].val1,0,0,0,
|
||||
skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1),0);
|
||||
sc_start(bl,type2,100,src->sc.data[type2].val1,skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -4217,7 +4207,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
|
||||
struct status_change *sc2 = src?status_get_sc(src):NULL;
|
||||
if (src && sc2 && sc2->count) {
|
||||
if (sc2->data[SC_CLOSECONFINE].timer == -1) //Start lock on caster.
|
||||
status_change_start(src,SC_CLOSECONFINE,100,sc->data[type].val1,1,0,0,tick+1000,0);
|
||||
sc_start4(src,SC_CLOSECONFINE,100,sc->data[type].val1,1,0,0,tick+1000);
|
||||
else { //Increase count of locked enemies and refresh time.
|
||||
sc2->data[SC_CLOSECONFINE].val2++;
|
||||
delete_timer(sc2->data[SC_CLOSECONFINE].timer, status_change_timer);
|
||||
@ -4784,7 +4774,7 @@ int status_change_end( struct block_list* bl , int type,int tid )
|
||||
DIFF_TICK(gettick(), sc->data[type].val4) <= 1000 &&
|
||||
(!sd || (sd->weapontype1 == 0 && sd->weapontype2 == 0))
|
||||
)
|
||||
status_change_start(bl,SC_SPURT,100,sc->data[type].val1,0,0,0,skill_get_time2(StatusSkillChangeTable[type], sc->data[type].val1),0);
|
||||
sc_start(bl,SC_SPURT,100,sc->data[type].val1,skill_get_time2(StatusSkillChangeTable[type], sc->data[type].val1));
|
||||
calc_flag = 1;
|
||||
break;
|
||||
case SC_AUTOBERSERK:
|
||||
@ -5134,10 +5124,9 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
|
||||
if (map_flag_gvg(sd->bl.m)) sp *= 5;
|
||||
if (pc_damage_sp(sd, sp, 0) > 0) {
|
||||
if ((++sc->data[type].val4) == 1) {
|
||||
status_change_start(bl, SC_INCSTR,100,
|
||||
1<<(sc->data[type].val1-1), 0, 0, 0,
|
||||
sc_start(bl, SC_INCSTR,100,1<<(sc->data[type].val1-1),
|
||||
(sc->data[SC_SPIRIT].timer != -1 && sc->data[SC_SPIRIT].val2 == SL_ROGUE?10:1) //SL bonus -> x10 duration
|
||||
*skill_get_time2(StatusSkillChangeTable[type],sc->data[type].val1), 0);
|
||||
*skill_get_time2(StatusSkillChangeTable[type],sc->data[type].val1));
|
||||
}
|
||||
sc->data[type].timer = add_timer( /* ƒ^ƒCƒ}?<3F>Ä<EFBFBD>Ý’è */
|
||||
sc->data[type].val2+tick, status_change_timer, bl->id, data);
|
||||
|
@ -481,7 +481,10 @@ int status_get_sc_def(struct block_list *bl, int type);
|
||||
#define status_get_sc_def_int(bl) (status_get_sc_def(bl, SP_MDEF2))
|
||||
#define status_get_sc_def_luk(bl) (status_get_sc_def(bl, SP_LUK))
|
||||
|
||||
// 状態異常関連 skill.c より移動
|
||||
//Short version, receives rate in 1->100 range, and does not uses a flag setting.
|
||||
#define sc_start(bl, type, rate, val1, tick) status_change_start(bl,type,100*(rate),val1,0,0,0,tick,0)
|
||||
#define sc_start4(bl, type, rate, val1, val2, val3, val4, tick) status_change_start(bl,type,100*(rate),val1,val2,val3,val4,tick,0)
|
||||
|
||||
int status_change_start(struct block_list *bl,int type,int rate,int val1,int val2,int val3,int val4,int tick,int flag);
|
||||
int status_change_end( struct block_list* bl , int type,int tid );
|
||||
int status_change_timer(int tid, unsigned int tick, int id, int data);
|
||||
|
Loading…
x
Reference in New Issue
Block a user