- Added the Monk combos to skill_castnodex so their delay is not decreased by skills.
- Added the actual skill delay of 1000ms to Triple Attack and Chain combo in skill_cast_db. Added Combo Finish and TigerFist as well with a delay of 700ms. - Phantasmic arrow now knockbacks even if it misses. - Adjusted the way Monk combo times work. The combo time is now always 300ms (adjusted by combo_delay_rate) which takes effect inmediately AFTER your current skill's canact-delay (which is why the particular skill delays were moved to skillcast_db) - Modified skill_delayfix so it performs the can-act reduction from agi/dex for combos there. - Modified pc_steal_item so that it behaves more closely to the way it does on Aegis. - Commented out the monster_noteleport mapflag from the guild castles as this is the Aegis behaviour git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9012 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
6e7319212f
commit
b8d25efdf3
@ -3,6 +3,16 @@ Date Added
|
|||||||
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
|
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
|
||||||
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||||
|
|
||||||
|
2006/10/19
|
||||||
|
* Phantasmic arrow now knockbacks even if it misses. [Skotlex]
|
||||||
|
* Adjusted the way Monk combo times work. The combo time is now always
|
||||||
|
300ms (adjusted by combo_delay_rate) which takes effect inmediately AFTER
|
||||||
|
your current skill's canact-delay (which is why the particular skill delays
|
||||||
|
were moved to skillcast_db) [Skotlex]
|
||||||
|
* Modified skill_delayfix so it performs the can-act reduction from agi/dex
|
||||||
|
for combos there. [Skotlex]
|
||||||
|
* Modified pc_steal_item so that it behaves more closely to the way it does
|
||||||
|
on Aegis. [Skotlex]
|
||||||
2006/10/18
|
2006/10/18
|
||||||
* Added a overflow check when calculating party exp share. [Skotlex]
|
* Added a overflow check when calculating party exp share. [Skotlex]
|
||||||
2006/10/16
|
2006/10/16
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
Date Added
|
Date Added
|
||||||
|
|
||||||
|
2006/10/19
|
||||||
|
* Commented out the monster_noteleport mapflag from the guild castles as
|
||||||
|
this is the Aegis behaviour [Skotlex]
|
||||||
2006/10/18
|
2006/10/18
|
||||||
* Added monster_noteleport mapflag to the guild castle maps to prevent
|
* Added monster_noteleport mapflag to the guild castle maps to prevent
|
||||||
"avoiding MVPs" by forcing them to teleport from rude-attacks. [Skotlex]
|
"avoiding MVPs" by forcing them to teleport from rude-attacks. [Skotlex]
|
||||||
|
@ -41,27 +41,27 @@ prtg_cas02.gat mapflag gvg_castle
|
|||||||
prtg_cas03.gat mapflag gvg_castle
|
prtg_cas03.gat mapflag gvg_castle
|
||||||
prtg_cas04.gat mapflag gvg_castle
|
prtg_cas04.gat mapflag gvg_castle
|
||||||
prtg_cas05.gat mapflag gvg_castle
|
prtg_cas05.gat mapflag gvg_castle
|
||||||
//Also set monster_noteleport to prevent MVPs from "escaping".
|
//Uncomment to disable monsters teleporting (prevents them from "escaping" when rude attacked)
|
||||||
aldeg_cas01.gat mapflag monster_noteleport
|
//aldeg_cas01.gat mapflag monster_noteleport
|
||||||
aldeg_cas02.gat mapflag monster_noteleport
|
//aldeg_cas02.gat mapflag monster_noteleport
|
||||||
aldeg_cas03.gat mapflag monster_noteleport
|
//aldeg_cas03.gat mapflag monster_noteleport
|
||||||
aldeg_cas04.gat mapflag monster_noteleport
|
//aldeg_cas04.gat mapflag monster_noteleport
|
||||||
aldeg_cas05.gat mapflag monster_noteleport
|
//aldeg_cas05.gat mapflag monster_noteleport
|
||||||
gefg_cas01.gat mapflag monster_noteleport
|
//gefg_cas01.gat mapflag monster_noteleport
|
||||||
gefg_cas02.gat mapflag monster_noteleport
|
//gefg_cas02.gat mapflag monster_noteleport
|
||||||
gefg_cas03.gat mapflag monster_noteleport
|
//gefg_cas03.gat mapflag monster_noteleport
|
||||||
gefg_cas04.gat mapflag monster_noteleport
|
//gefg_cas04.gat mapflag monster_noteleport
|
||||||
gefg_cas05.gat mapflag monster_noteleport
|
//gefg_cas05.gat mapflag monster_noteleport
|
||||||
payg_cas01.gat mapflag monster_noteleport
|
//payg_cas01.gat mapflag monster_noteleport
|
||||||
payg_cas02.gat mapflag monster_noteleport
|
//payg_cas02.gat mapflag monster_noteleport
|
||||||
payg_cas03.gat mapflag monster_noteleport
|
//payg_cas03.gat mapflag monster_noteleport
|
||||||
payg_cas04.gat mapflag monster_noteleport
|
//payg_cas04.gat mapflag monster_noteleport
|
||||||
payg_cas05.gat mapflag monster_noteleport
|
//payg_cas05.gat mapflag monster_noteleport
|
||||||
prtg_cas01.gat mapflag monster_noteleport
|
//prtg_cas01.gat mapflag monster_noteleport
|
||||||
prtg_cas02.gat mapflag monster_noteleport
|
//prtg_cas02.gat mapflag monster_noteleport
|
||||||
prtg_cas03.gat mapflag monster_noteleport
|
//prtg_cas03.gat mapflag monster_noteleport
|
||||||
prtg_cas04.gat mapflag monster_noteleport
|
//prtg_cas04.gat mapflag monster_noteleport
|
||||||
prtg_cas05.gat mapflag monster_noteleport
|
//prtg_cas05.gat mapflag monster_noteleport
|
||||||
|
|
||||||
// Novice Guild Castles ===
|
// Novice Guild Castles ===
|
||||||
//n_castle.gat mapflag gvg_castle
|
//n_castle.gat mapflag gvg_castle
|
||||||
@ -70,10 +70,10 @@ nguild_gef.gat mapflag gvg_castle
|
|||||||
nguild_pay.gat mapflag gvg_castle
|
nguild_pay.gat mapflag gvg_castle
|
||||||
nguild_prt.gat mapflag gvg_castle
|
nguild_prt.gat mapflag gvg_castle
|
||||||
|
|
||||||
nguild_alde.gat mapflag monster_noteleport
|
//nguild_alde.gat mapflag monster_noteleport
|
||||||
nguild_gef.gat mapflag monster_noteleport
|
//nguild_gef.gat mapflag monster_noteleport
|
||||||
nguild_pay.gat mapflag monster_noteleport
|
//nguild_pay.gat mapflag monster_noteleport
|
||||||
nguild_prt.gat mapflag monster_noteleport
|
//nguild_prt.gat mapflag monster_noteleport
|
||||||
|
|
||||||
// Guild Dungeons =========
|
// Guild Dungeons =========
|
||||||
gld_dun01.gat mapflag gvg_dungeon
|
gld_dun01.gat mapflag gvg_dungeon
|
||||||
|
@ -19,6 +19,12 @@
|
|||||||
-----
|
-----
|
||||||
|
|
||||||
========================
|
========================
|
||||||
|
10/19
|
||||||
|
* Added the actual skill delay of 1000ms to Triple Attack and Chain combo
|
||||||
|
in skill_cast_db. Added Combo Finish and TigerFist as well with a delay of
|
||||||
|
700ms. [Skotlex]
|
||||||
|
* Added the Monk combos to skill_castnodex so their delay is not decreased
|
||||||
|
by skills. [Skotlex]
|
||||||
10/18
|
10/18
|
||||||
* Updated the packetdb for the 2006-10-17a client. [Zephiris]
|
* Updated the packetdb for the 2006-10-17a client. [Zephiris]
|
||||||
10/16
|
10/16
|
||||||
|
@ -414,7 +414,8 @@
|
|||||||
261,1000,0,0,600000,0
|
261,1000,0,0,600000,0
|
||||||
//-- MO_ABSORBSPIRITS
|
//-- MO_ABSORBSPIRITS
|
||||||
262,2000,0,0,0,0
|
262,2000,0,0,0,0
|
||||||
|
//-- MO_TRIPLEATTACK
|
||||||
|
263,0,1000,0,0,0
|
||||||
//-- MO_INVESTIGATE
|
//-- MO_INVESTIGATE
|
||||||
266,1000,500,0,0,0
|
266,1000,500,0,0,0
|
||||||
//-- MO_FINGEROFFENSIVE
|
//-- MO_FINGEROFFENSIVE
|
||||||
@ -427,9 +428,12 @@
|
|||||||
270,0,0,0,180000,0
|
270,0,0,0,180000,0
|
||||||
//-- MO_EXTREMITYFIST
|
//-- MO_EXTREMITYFIST
|
||||||
271,4000:3500:3000:2500:2000,3000:2500:2000:1500:1000,0,0,300000
|
271,4000:3500:3000:2500:2000,3000:2500:2000:1500:1000,0,0,300000
|
||||||
|
//-- MO_CHAINCOMBO
|
||||||
|
272,0,1000,0,0,0
|
||||||
|
//-- MO_COMBOFINISH
|
||||||
|
273,0,700,0,0,0
|
||||||
//==========================================
|
//==========================================
|
||||||
|
|
||||||
|
|
||||||
//===== Sage ===============================
|
//===== Sage ===============================
|
||||||
//-- SA_MAGICROD
|
//-- SA_MAGICROD
|
||||||
276,0,1500,0,400:600:800:1000:1200,0
|
276,0,1500,0,400:600:800:1000:1200,0
|
||||||
@ -595,7 +599,7 @@
|
|||||||
//-- CH_PALMSTRIKE
|
//-- CH_PALMSTRIKE
|
||||||
370,0,300,0,0,0
|
370,0,300,0,0,0
|
||||||
//-- CH_TIGERFIST
|
//-- CH_TIGERFIST
|
||||||
371,0,0,0,0,2000:4000:6000:8000:10000
|
371,0,700,0,0,2000:4000:6000:8000:10000
|
||||||
//-- CH_CHAINCRUSH
|
//-- CH_CHAINCRUSH
|
||||||
372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,0
|
372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,0
|
||||||
//==========================================
|
//==========================================
|
||||||
|
@ -8,10 +8,14 @@
|
|||||||
// Delay: With 0, dex affects the skill's delay rate
|
// Delay: With 0, dex affects the skill's delay rate
|
||||||
// Example - 46,1,1 = Double Strafe's casting time and delay is not affected by dex.
|
// Example - 46,1,1 = Double Strafe's casting time and delay is not affected by dex.
|
||||||
// By default, dex NEVER affects after-cast delay, so no need of putting 'x,0,1' in this file
|
// By default, dex NEVER affects after-cast delay, so no need of putting 'x,0,1' in this file
|
||||||
|
263,0,2 //MO_TRIPLEATTACK
|
||||||
|
272,0,2 //MO_CHAINCOMBO
|
||||||
|
273,0,2 //MO_COMBOFINISH
|
||||||
336,1 //WE_CALLPARTNER
|
336,1 //WE_CALLPARTNER
|
||||||
366,1 //HW_MAGICPOWER
|
366,1 //HW_MAGICPOWER
|
||||||
370,1 //CH_PALMSTRIKE
|
370,1 //CH_PALMSTRIKE
|
||||||
|
371,0,2 //CH_TIGERFIST
|
||||||
|
372,0,2 //CH_CHAINCRUSH
|
||||||
403,3 //PF_MEMORIZE
|
403,3 //PF_MEMORIZE
|
||||||
408,1 //WE_BABY
|
408,1 //WE_BABY
|
||||||
409,1 //WE_CALLPARENT
|
409,1 //WE_CALLPARENT
|
||||||
|
45
src/map/pc.c
45
src/map/pc.c
@ -3179,9 +3179,10 @@ int pc_show_steal(struct block_list *bl,va_list ap)
|
|||||||
*------------------------------------------
|
*------------------------------------------
|
||||||
*/
|
*/
|
||||||
//** pc.c:
|
//** pc.c:
|
||||||
int pc_steal_item(struct map_session_data *sd,struct block_list *bl)
|
int pc_steal_item(struct map_session_data *sd,struct block_list *bl, int lv)
|
||||||
{
|
{
|
||||||
int i,skill,itemid,flag;
|
static int i = 0;
|
||||||
|
int rate,itemid,flag;
|
||||||
struct status_data *sd_status, *md_status;
|
struct status_data *sd_status, *md_status;
|
||||||
struct mob_data *md;
|
struct mob_data *md;
|
||||||
struct item tmp_item;
|
struct item tmp_item;
|
||||||
@ -3193,33 +3194,43 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl)
|
|||||||
md_status= status_get_status_data(bl);
|
md_status= status_get_status_data(bl);
|
||||||
md = (TBL_MOB *)bl;
|
md = (TBL_MOB *)bl;
|
||||||
|
|
||||||
if(md->state.steal_flag>=battle_config.skill_steal_max_tries || md_status->mode&MD_BOSS || md->master_id ||
|
if(md->state.steal_flag>=battle_config.skill_steal_max_tries ||
|
||||||
|
md_status->mode&MD_BOSS || md->master_id ||
|
||||||
(md->class_>=1324 && md->class_<1364) || // prevent stealing from treasure boxes [Valaris]
|
(md->class_>=1324 && md->class_<1364) || // prevent stealing from treasure boxes [Valaris]
|
||||||
map[md->bl.m].flag.nomobloot || // check noloot map flag [Lorky]
|
map[md->bl.m].flag.nomobloot || // check noloot map flag [Lorky]
|
||||||
md->sc.data[SC_STONE].timer != -1 || md->sc.data[SC_FREEZE].timer != -1 //status change check
|
md->sc.opt1 //status change check
|
||||||
)
|
)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
skill = battle_config.skill_steal_type == 1
|
rate = battle_config.skill_steal_type
|
||||||
? (sd_status->dex - md_status->dex)/2 + pc_checkskill(sd,TF_STEAL)*6 + 10
|
? (sd_status->dex - md_status->dex)/2 + lv*6 + 10
|
||||||
: sd_status->dex - md_status->dex + pc_checkskill(sd,TF_STEAL)*3 + 10;
|
: sd_status->dex - md_status->dex + lv*3 + 10;
|
||||||
|
|
||||||
skill+= sd->add_steal_rate; //Better make the steal_Rate addition affect % rather than an absolute on top of the total drop rate. [Skotlex]
|
rate += sd->add_steal_rate; //Better make the steal_Rate addition affect % rather than an absolute on top of the total drop rate. [Skotlex]
|
||||||
|
|
||||||
if (skill < 1)
|
if (rate < 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
md->state.steal_flag++; //increase steal tries number
|
md->state.steal_flag++; //increase steal tries number
|
||||||
|
|
||||||
for(i = 0; i<MAX_MOB_DROP; i++)//Pick one mobs drop slot.
|
//preliminar statistical data hints at this behaviour:
|
||||||
{
|
//each steal attempt: try to steal against ONE mob drop, and no more.
|
||||||
itemid = md->db->dropitem[i].nameid;
|
//We use a static index to prevent giving priority to any of the slots.
|
||||||
if(itemid <= 0 || (itemid>4000 && itemid<5000 && pc_checkskill(sd,TF_STEAL) <= 5))
|
old_i = i;
|
||||||
continue;
|
do {
|
||||||
if(rand() % 10000 < md->db->dropitem[i].p*skill/100)
|
i++;
|
||||||
break;
|
if (i == MAX_MOB_DROP-1 && lv <= 5)
|
||||||
|
continue; //Cannot steal "last slot" (card slot)
|
||||||
|
if (i == MAX_MOB_DROP)
|
||||||
|
i = 0;
|
||||||
|
} while (md->db->dropitem[i].p <= 0 && old_i != i);
|
||||||
|
|
||||||
|
if(old_i == i) {
|
||||||
|
md->state.steal_flag = UCHAR_MAX; //Tag for speed up in case you reinsist
|
||||||
|
return 0; //Mob has nothing stealable!
|
||||||
}
|
}
|
||||||
if (i == MAX_MOB_DROP)
|
|
||||||
|
if(rand() % 10000 >= md->db->dropitem[i].p*rate/100)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
md->state.steal_flag = UCHAR_MAX; //you can't steal from this mob any more
|
md->state.steal_flag = UCHAR_MAX; //you can't steal from this mob any more
|
||||||
|
@ -171,7 +171,7 @@ int pc_skill(struct map_session_data*,int,int,int);
|
|||||||
|
|
||||||
int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
|
int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
|
||||||
|
|
||||||
int pc_steal_item(struct map_session_data *sd,struct block_list *bl);
|
int pc_steal_item(struct map_session_data *sd,struct block_list *bl, int skilllv);
|
||||||
int pc_steal_coin(struct map_session_data *sd,struct block_list *bl);
|
int pc_steal_coin(struct map_session_data *sd,struct block_list *bl);
|
||||||
|
|
||||||
int pc_modifybuyvalue(struct map_session_data*,int);
|
int pc_modifybuyvalue(struct map_session_data*,int);
|
||||||
|
103
src/map/skill.c
103
src/map/skill.c
@ -1031,7 +1031,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
|
|||||||
if(dstmd && dstmd->state.steal_flag<battle_config.skill_steal_max_tries && sd->status.weapon != W_BOW &&
|
if(dstmd && dstmd->state.steal_flag<battle_config.skill_steal_max_tries && sd->status.weapon != W_BOW &&
|
||||||
(skill=pc_checkskill(sd,RG_SNATCHER)) > 0 &&
|
(skill=pc_checkskill(sd,RG_SNATCHER)) > 0 &&
|
||||||
(skill*15 + 55) + pc_checkskill(sd,TF_STEAL)*10 > rand()%1000) {
|
(skill*15 + 55) + pc_checkskill(sd,TF_STEAL)*10 > rand()%1000) {
|
||||||
if(pc_steal_item(sd,bl))
|
if(pc_steal_item(sd,bl,pc_checkskill(sd,TF_STEAL)))
|
||||||
clif_skill_nodamage(src,bl,TF_STEAL,skill,1);
|
clif_skill_nodamage(src,bl,TF_STEAL,skill,1);
|
||||||
else
|
else
|
||||||
clif_skill_fail(sd,RG_SNATCHER,0,0);
|
clif_skill_fail(sd,RG_SNATCHER,0,0);
|
||||||
@ -1896,7 +1896,9 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
|
|||||||
type=(skillid==0)?5:skill_get_hit(skillid);
|
type=(skillid==0)?5:skill_get_hit(skillid);
|
||||||
|
|
||||||
if(damage < dmg.div_
|
if(damage < dmg.div_
|
||||||
&& skillid != CH_PALMSTRIKE) //Palm Strike is the only skill that will knockback even if it misses. [Skotlex]
|
//Only skills that knockback even when they miss. [Skotlex]
|
||||||
|
&& skillid != CH_PALMSTRIKE
|
||||||
|
&& skillid != HT_PHANTASMIC)
|
||||||
dmg.blewcount = 0;
|
dmg.blewcount = 0;
|
||||||
|
|
||||||
if(skillid == CR_GRANDCROSS||skillid == NPC_GRANDDARKNESS) {
|
if(skillid == CR_GRANDCROSS||skillid == NPC_GRANDDARKNESS) {
|
||||||
@ -1906,8 +1908,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(sd) {
|
if(sd) {
|
||||||
//Sorry for removing the Japanese comments, but they were actually distracting
|
int flag = 0; //Used to signal if this skill can be combo'ed later on.
|
||||||
//from the actual code and I couldn't understand a thing anyway >.< [Skotlex]
|
|
||||||
if (sd->sc.data[SC_COMBO].timer!=-1)
|
if (sd->sc.data[SC_COMBO].timer!=-1)
|
||||||
{ //End combo state after skill is invoked. [Skotlex]
|
{ //End combo state after skill is invoked. [Skotlex]
|
||||||
switch (skillid) {
|
switch (skillid) {
|
||||||
@ -1933,65 +1934,29 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
|
|||||||
switch(skillid)
|
switch(skillid)
|
||||||
{
|
{
|
||||||
case MO_TRIPLEATTACK:
|
case MO_TRIPLEATTACK:
|
||||||
{
|
|
||||||
int delay = 1000 - 4*sstatus->agi - 2*sstatus->dex;
|
|
||||||
if (pc_checkskill(sd, MO_CHAINCOMBO) > 0)
|
|
||||||
delay += 300 * battle_config.combo_delay_rate / 100;
|
|
||||||
sc_start(src,SC_COMBO,100,MO_TRIPLEATTACK,delay);
|
|
||||||
clif_combo_delay(src, delay);
|
|
||||||
|
|
||||||
if (sd->status.party_id>0) //bonus from SG_FRIEND [Komurka]
|
if (sd->status.party_id>0) //bonus from SG_FRIEND [Komurka]
|
||||||
party_skill_check(sd, sd->status.party_id, MO_TRIPLEATTACK, skilllv);
|
party_skill_check(sd, sd->status.party_id, MO_TRIPLEATTACK, skilllv);
|
||||||
|
if (pc_checkskill(sd, MO_CHAINCOMBO) > 0)
|
||||||
|
flag=1;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case MO_CHAINCOMBO:
|
case MO_CHAINCOMBO:
|
||||||
{
|
|
||||||
int delay = 1000 - 4*sstatus->agi - 2*sstatus->dex;
|
|
||||||
if(pc_checkskill(sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0)
|
if(pc_checkskill(sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0)
|
||||||
delay += 300 * battle_config.combo_delay_rate /100;
|
flag=1;
|
||||||
sc_start(src,SC_COMBO,100,MO_CHAINCOMBO,delay);
|
|
||||||
clif_combo_delay(src,delay);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case MO_COMBOFINISH:
|
case MO_COMBOFINISH:
|
||||||
{
|
if (pc_checkskill(sd, CH_TIGERFIST) > 0 && sd->spiritball > 0)
|
||||||
int delay = 700 - 4*sstatus->agi - 2*sstatus->dex;
|
flag=1;
|
||||||
if (
|
|
||||||
(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc.data[SC_EXPLOSIONSPIRITS].timer != -1) ||
|
|
||||||
(pc_checkskill(sd, CH_TIGERFIST) > 0 && sd->spiritball > 0) ||
|
|
||||||
(pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1)
|
|
||||||
)
|
|
||||||
delay += 300 * battle_config.combo_delay_rate /100;
|
|
||||||
sc_start(src,SC_COMBO,100,MO_COMBOFINISH,delay);
|
|
||||||
clif_combo_delay(src,delay);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CH_TIGERFIST:
|
case CH_TIGERFIST:
|
||||||
{ //Tigerfist is now a combo-only skill. [Skotlex]
|
if (!flag && pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1)
|
||||||
int delay = 1000 - 4*sstatus->agi - 2*sstatus->dex;
|
flag=1;
|
||||||
if(
|
|
||||||
(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 3 && sd->sc.data[SC_EXPLOSIONSPIRITS].timer != -1) ||
|
|
||||||
(pc_checkskill(sd, CH_CHAINCRUSH) > 0)
|
|
||||||
)
|
|
||||||
delay += 300 * battle_config.combo_delay_rate /100;
|
|
||||||
sc_start(src,SC_COMBO,100,CH_TIGERFIST,delay);
|
|
||||||
clif_combo_delay(src,delay);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CH_CHAINCRUSH:
|
case CH_CHAINCRUSH:
|
||||||
{
|
if (!flag && pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball > 0 && sd->sc.data[SC_EXPLOSIONSPIRITS].timer != -1)
|
||||||
int delay = 1000 - 4*sstatus->agi - 2*sstatus->dex;
|
flag=1;
|
||||||
if(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 &&
|
|
||||||
sd->spiritball >= 1 &&
|
|
||||||
sd->sc.data[SC_EXPLOSIONSPIRITS].timer != -1)
|
|
||||||
delay += 300 * battle_config.combo_delay_rate /100;
|
|
||||||
sc_start(src,SC_COMBO,100,CH_CHAINCRUSH,delay);
|
|
||||||
clif_combo_delay(src,delay);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case AC_DOUBLE:
|
case AC_DOUBLE:
|
||||||
if((tstatus->race == RC_BRUTE || tstatus->race == RC_INSECT) &&
|
if((tstatus->race == RC_BRUTE || tstatus->race == RC_INSECT) &&
|
||||||
pc_checkskill(sd, HT_POWER)) {
|
pc_checkskill(sd, HT_POWER))
|
||||||
|
{
|
||||||
//TODO: This code was taken from Triple Blows, is this even how it should be? [Skotlex]
|
//TODO: This code was taken from Triple Blows, is this even how it should be? [Skotlex]
|
||||||
sc_start4(src,SC_COMBO,100,HT_POWER,bl->id,0,0,2000);
|
sc_start4(src,SC_COMBO,100,HT_POWER,bl->id,0,0,2000);
|
||||||
clif_combo_delay(src,2000);
|
clif_combo_delay(src,2000);
|
||||||
@ -2014,6 +1979,13 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
|
|||||||
sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick;
|
sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick;
|
||||||
break;
|
break;
|
||||||
} //Switch End
|
} //Switch End
|
||||||
|
if (flag) { //Possible to chain
|
||||||
|
flag = DIFF_TICK(sd->ud.canact_tick, tick);
|
||||||
|
if (flag < 0) flag = 0;
|
||||||
|
flag += 300 * battle_config.combo_delay_rate/100;
|
||||||
|
sc_start(src,SC_COMBO,100,skillid,flag);
|
||||||
|
clif_combo_delay(src, flag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Display damage.
|
//Display damage.
|
||||||
@ -4223,7 +4195,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
|
|||||||
|
|
||||||
case TF_STEAL:
|
case TF_STEAL:
|
||||||
if(sd) {
|
if(sd) {
|
||||||
if(pc_steal_item(sd,bl))
|
if(pc_steal_item(sd,bl,skilllv))
|
||||||
clif_skill_nodamage(src,bl,skillid,skilllv,1);
|
clif_skill_nodamage(src,bl,skillid,skilllv,1);
|
||||||
else
|
else
|
||||||
clif_skill_fail(sd,skillid,0x0a,0);
|
clif_skill_fail(sd,skillid,0x0a,0);
|
||||||
@ -8613,7 +8585,7 @@ int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv)
|
|||||||
|
|
||||||
if (bl->type&battle_config.no_skill_delay)
|
if (bl->type&battle_config.no_skill_delay)
|
||||||
return battle_config.min_skill_delay_limit;
|
return battle_config.min_skill_delay_limit;
|
||||||
|
|
||||||
// instant cast attack skills depend on aspd as delay [celest]
|
// instant cast attack skills depend on aspd as delay [celest]
|
||||||
if (time == 0) {
|
if (time == 0) {
|
||||||
if (skill_get_type(skill_id)&(BF_WEAPON|BF_MISC) && !(skill_get_nk(skill_id)&NK_NO_DAMAGE))
|
if (skill_get_type(skill_id)&(BF_WEAPON|BF_MISC) && !(skill_get_nk(skill_id)&NK_NO_DAMAGE))
|
||||||
@ -8623,13 +8595,24 @@ int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv)
|
|||||||
} else if (time < 0)
|
} else if (time < 0)
|
||||||
time = -time + status_get_amotion(bl); // if set to <0, the attack motion is added.
|
time = -time + status_get_amotion(bl); // if set to <0, the attack motion is added.
|
||||||
else //Agi reduction should apply only to non-zero delay skills.
|
else //Agi reduction should apply only to non-zero delay skills.
|
||||||
if (battle_config.delay_dependon_agi && !(delaynochange&1))
|
switch (skill_id)
|
||||||
{ // if skill casttime is allowed to be reduced by dex
|
{ //Monk combo skills have their delay reduced by agi/dex.
|
||||||
int scale = battle_config.castrate_dex_scale - status_get_agi(bl);
|
case MO_TRIPLEATTACK:
|
||||||
if (scale > 0)
|
case MO_CHAINCOMBO:
|
||||||
time = time * scale / battle_config.castrate_dex_scale;
|
case MO_COMBOFINISH:
|
||||||
else //To be capped later to minimum.
|
case CH_TIGERFIST:
|
||||||
time = 0;
|
case CH_CHAINCRUSH:
|
||||||
|
time -= 4*status_get_agi(bl) - 2*status_get_dex(bl);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (battle_config.delay_dependon_agi && !(delaynochange&1))
|
||||||
|
{ // if skill casttime is allowed to be reduced by dex
|
||||||
|
int scale = battle_config.castrate_dex_scale - status_get_agi(bl);
|
||||||
|
if (scale > 0)
|
||||||
|
time = time * scale / battle_config.castrate_dex_scale;
|
||||||
|
else //To be capped later to minimum.
|
||||||
|
time = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bl->type == BL_PC && ((TBL_PC*)bl)->delayrate != 100)
|
if (bl->type == BL_PC && ((TBL_PC*)bl)->delayrate != 100)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user