diff options
author | L0ne_W0lf <L0ne_W0lf@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2011-08-27 03:25:00 +0000 |
---|---|---|
committer | L0ne_W0lf <L0ne_W0lf@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2011-08-27 03:25:00 +0000 |
commit | 1fe2e1773b9a7218fe5e39c4d2116194216b6986 (patch) | |
tree | 31a19349a7c55280bd21eeab4831fc0b838678bc /src/map/clif.c | |
parent | a2ec62d8f24cbc11dcb646712c4c16a5cf897372 (diff) | |
download | hercules-1fe2e1773b9a7218fe5e39c4d2116194216b6986.tar.gz hercules-1fe2e1773b9a7218fe5e39c4d2116194216b6986.tar.bz2 hercules-1fe2e1773b9a7218fe5e39c4d2116194216b6986.tar.xz hercules-1fe2e1773b9a7218fe5e39c4d2116194216b6986.zip |
- Implemented first version of Archbishop skills. Preliminary version, see doc/3rd_job_notes.txt for details/bugs/issues with skills.
- Implemented fixed cast time, old cast time mechanics no longer available. Added bFixedCastRate used for reducing fixed cast time mechanic.
Cast time calculations probably still needs work, as the cast rate reductions are probably additive and multiplicative as they used to be.
- As a result, skill_delayfix_sc() has been removed, status effects that modify cast time are now calculated DURING cast time, not after.
- Implemented skill cooldown in skill_cast_db.txt. Known issue is that the cooldowns should save on logout/server shutdown/etc.
- Implemented new heal calculation and started work on MATK. Added bWeaponMatk, and bEquipmentMatk for use with new MATK mechanic.
- Removed custom features and their config settings: delay_dependon_dex, delay_dependon_agi, castrate_dex_scale.
- Increased max_def to 9999 for now, as that is by default the largest defense increase found in the Renewal database (Ahura_mazdah, GM item)
- Added shield aspd reduction from job_db1.txt-- Not 100% sure on this one yet. Should be considered a WIP.
- Modified updatestatus(), to display information more in line with the client's status window.
- Updated some calculations in status_calc_misc to match renewal, needs a lot of work still.
- ST_CHASEWALK and HP_BASILICA no longer have 0 cast time while being canceled.
* Implemented 'Boss' Decrease AGI, like 'Boss' Heal - editable in skill.conf
* clif_skill_fail() now accepts a new parameter, to be used in later messages.
* status_change_start() now stores tick as duration upon being called, which fixes timers calling the function from showing negative durations.
* Implemented skill ALL_PARTYFLEE. 1 level, increases party member flee by 10.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/branches/renewal@14941 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/clif.c')
-rw-r--r-- | src/map/clif.c | 95 |
1 files changed, 66 insertions, 29 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index 8d2159823..9c8fabfbf 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -2512,10 +2512,10 @@ int clif_updatestatus(struct map_session_data *sd,int type) WFIFOL(fd,4)=sd->battle_status.cri/10; break; case SP_MATK1: - WFIFOL(fd,4)=sd->battle_status.matk_max; + WFIFOL(fd,4)=sd->weapon_matk + sd->battle_status.rhw.atk2 + sd->equipment_matk; break; case SP_MATK2: - WFIFOL(fd,4)=sd->battle_status.matk_min; + WFIFOL(fd,4)=sd->battle_status.status_matk; break; @@ -2842,9 +2842,9 @@ int clif_initialstatus(struct map_session_data *sd) WBUFB(buf,14)=min(sd->status.luk, UCHAR_MAX); WBUFB(buf,15)=pc_need_status_point(sd,SP_LUK,1); - WBUFW(buf,16) = sd->battle_status.batk + sd->battle_status.rhw.atk + sd->battle_status.lhw.atk; + WBUFW(buf,16) = sd->battle_status.batk; WBUFW(buf,18) = sd->battle_status.rhw.atk2 + sd->battle_status.lhw.atk2; //atk bonus - WBUFW(buf,20) = sd->battle_status.matk_max; + WBUFW(buf,20) = sd->weapon_matk + sd->battle_status.rhw.atk2 + sd->equipment_matk; WBUFW(buf,22) = sd->battle_status.matk_min; WBUFW(buf,24) = sd->battle_status.def; // def WBUFW(buf,26) = sd->battle_status.def2; @@ -2872,6 +2872,9 @@ int clif_initialstatus(struct map_session_data *sd) clif_updatestatus(sd,SP_ATTACKRANGE); clif_updatestatus(sd,SP_ASPD); + clif_updatestatus(sd,SP_MATK1); + clif_updatestatus(sd,SP_MATK2); + return 0; } @@ -4357,7 +4360,8 @@ int clif_skillcastcancel(struct block_list* bl) /// btype==5 "no shout" MsgStringTable[164] /// btype==6 "no PKing" MsgStringTable[165] /// btype==7 "no alligning" MsgStringTable[383] -/// btype>=8: ignored +/// btype==8: "Insufficient level for joining a Party" +/// btype>=9: Ignored. /// if(skill_id==AL_WARP) "not enough skill level" MsgStringTable[214] /// if(skill_id==TF_STEAL) "steal failed" MsgStringTable[205] /// if(skill_id==TF_POISON) "envenom failed" MsgStringTable[207] @@ -4373,12 +4377,43 @@ int clif_skillcastcancel(struct block_list* bl) /// type==8 "blue gemstone needed" MsgStringTable[247] /// type==9 "overweight" MsgStringTable[580] /// type==10 "skill failed" MsgStringTable[285] -/// type>=11 ignored +/// type==11 "This skill can't be used on that object" +/// type==12 "You can't use skill because you have exceeded the number Ansila possession limit" +/// type==13 "need Holy Water" +/// type==14 "need Ancilla to cast skill" +/// type==15 "Can't be duplicated with certain distance" +/// type==16 "In order to use this skill, you need other skill" +/// type==17 "This skill can't be used alone" +/// type==18 "This skill can be used to certain direction only" +/// type==19 "Can't summon anymore" +/// type==20 "There is no summoned sphere" +/// type==21 "There exists no usable imitaion skill" +/// type==22 "You can't reuse this skill" +/// type==23 "Skill can't be used in this state" +/// type==24 "Paintbrush is needed" +/// type==25 "available only on the dragon" +/// type==26 "Skill can't be used on designated spot " +/// type==27 "Assistant SP is not enough" +/// type==31 "Can only be used for linked to weapon blocking" +/// type==32 "Need a weapon coated with poison of a guillotine cross v" +/// type==33 "Can only be used while riding Madogear" +/// type==37 "Load a Cannon Ball" +/// type==40 "Can only be used in Hovering state" +/// type==43 "Need a Guillotine Poison" +/// type==50 "Can't be used while on Magic Gear" +/// type==51 "Need a Magic Book" +/// type==52 "Feel sleepy since Magic Book is too difficult to understand" +/// type==53 "Not enough saved point" +/// type==54 "Can't read a Magic Book anymore" +/// type==57 "usable only when cart is put on" +/// type==60 "Can't cast anymore" +/// type==71 "[ITEMID] need AMOUNT" +/// type==72 "Need to put on [ITEMID] in order to use" /// /// if(success!=0) doesn't display any of the previous messages /// Note: when this packet is received an unknown flag is always set to 0, /// suggesting this is an ACK packet for the UseSkill packets and should be sent on success too [FlavioJS] -int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype) +int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype, int val) { int fd; @@ -4405,8 +4440,9 @@ int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype) WFIFOHEAD(fd,packet_len(0x110)); WFIFOW(fd,0) = 0x110; WFIFOW(fd,2) = skill_id; - WFIFOL(fd,4) = btype; - WFIFOB(fd,8) = 0;// success + WFIFOW(fd,4) = btype; + WFIFOW(fd,6) = val; + WFIFOB(fd,8) = 0; WFIFOB(fd,9) = type; WFIFOSET(fd,packet_len(0x110)); @@ -4896,7 +4932,8 @@ int clif_status_change(struct block_list *bl,int type,int flag,unsigned int tick type == SI_TENSIONRELAX || type == SI_LANDENDOW || type == SI_AUTOBERSERK || type == SI_BUMP || type == SI_READYSTORM || type == SI_READYDOWN || type == SI_READYTURN || type == SI_READYCOUNTER || type == SI_DODGE || - type == SI_DEVIL || type == SI_NIGHT || type == SI_INTRAVISION) + type == SI_DEVIL || type == SI_NIGHT || type == SI_INTRAVISION || + type == SI_CLOAKING) tick=0; if( battle_config.display_status_timers && tick>0 ) @@ -5381,7 +5418,7 @@ int clif_item_repair_list(struct map_session_data *sd,struct map_session_data *d sd->menuskill_id = BS_REPAIRWEAPON; sd->menuskill_val = dstsd->bl.id; }else - clif_skill_fail(sd,sd->ud.skillid,0,0); + clif_skill_fail(sd,sd->ud.skillid,0,0,0); return 0; } @@ -9037,13 +9074,13 @@ void clif_parse_Emotion(int fd, struct map_session_data *sd) if (battle_config.basic_skill_check == 0 || pc_checkskill(sd, NV_BASIC) >= 2) { if (emoticon == E_MUTE) {// prevent use of the mute emote [Valaris] - clif_skill_fail(sd, 1, 0, 1); + clif_skill_fail(sd, 1, 0, 1, 0); return; } // fix flood of emotion icon (ro-proxy): flood only the hacker player if (sd->emotionlasttime >= time(NULL)) { sd->emotionlasttime = time(NULL) + 1; // not more than 1 per second (using /commands the client can spam it) - clif_skill_fail(sd, 1, 0, 1); + clif_skill_fail(sd, 1, 0, 1, 0); return; } sd->emotionlasttime = time(NULL) + 1; // not more than 1 per second (using /commands the client can spam it) @@ -9055,7 +9092,7 @@ void clif_parse_Emotion(int fd, struct map_session_data *sd) clif_emotion(&sd->bl, emoticon); } else - clif_skill_fail(sd, 1, 0, 1); + clif_skill_fail(sd, 1, 0, 1, 0); } /*========================================== @@ -9104,7 +9141,7 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, if (!battle_config.sdelay_attack_enable && pc_checkskill(sd, SA_FREECAST) <= 0) { if (DIFF_TICK(tick, sd->ud.canact_tick) < 0) { - clif_skill_fail(sd, 1, 4, 0); + clif_skill_fail(sd, 1, 4, 0, 0); return; } } @@ -9115,7 +9152,7 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, break; case 0x02: // sitdown if (battle_config.basic_skill_check && pc_checkskill(sd, NV_BASIC) < 3) { - clif_skill_fail(sd, 1, 0, 2); + clif_skill_fail(sd, 1, 0, 2, 0); break; } @@ -9642,7 +9679,7 @@ void clif_parse_CreateChatRoom(int fd, struct map_session_data* sd) if (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM) return; if(battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 4) { - clif_skill_fail(sd,1,0,3); + clif_skill_fail(sd,1,0,3,0); return; } @@ -9754,7 +9791,7 @@ void clif_parse_TradeRequest(int fd,struct map_session_data *sd) if( battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 1) { - clif_skill_fail(sd,1,0,0); + clif_skill_fail(sd,1,0,0,0); return; } @@ -9940,7 +9977,7 @@ static void clif_parse_UseSkillToPos_mercenary(struct mercenary_data *md, struct return; if( DIFF_TICK(tick, md->ud.canact_tick) < 0 ) { - clif_skill_fail(md->master, skillnum, 4, 0); + clif_skill_fail(md->master, skillnum, 4, 0, 0); return; } @@ -10010,7 +10047,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) { if( sd->skillitem != skillnum ) { - clif_skill_fail(sd, skillnum, 4, 0); + clif_skill_fail(sd, skillnum, 0x04, 0, 0); return; } } @@ -10086,7 +10123,7 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, short skil { if( pc_issit(sd) ) { - clif_skill_fail(sd, skillnum, 0, 0); + clif_skill_fail(sd, skillnum, 0, 0, 0); return; } //You can't use Graffiti/TalkieBox AND have a vending open, so this is safe. @@ -10100,7 +10137,7 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, short skil { if( sd->skillitem != skillnum ) { - clif_skill_fail(sd, skillnum, 4, 0); + clif_skill_fail(sd, skillnum, 4, 0, 0); return; } } @@ -10209,7 +10246,7 @@ void clif_parse_ProduceMix(int fd,struct map_session_data *sd) if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. - clif_skill_fail(sd,sd->ud.skillid,0,0); + clif_skill_fail(sd,sd->ud.skillid,0,0,0); sd->menuskill_val = sd->menuskill_id = 0; return; } @@ -10231,7 +10268,7 @@ void clif_parse_Cooking(int fd,struct map_session_data *sd) if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. - clif_skill_fail(sd,sd->ud.skillid,0,0); + clif_skill_fail(sd,sd->ud.skillid,0,0,0); sd->menuskill_val = sd->menuskill_id = 0; return; } @@ -10247,7 +10284,7 @@ void clif_parse_RepairItem(int fd, struct map_session_data *sd) return; if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. - clif_skill_fail(sd,sd->ud.skillid,0,0); + clif_skill_fail(sd,sd->ud.skillid,0,0,0); sd->menuskill_val = sd->menuskill_id = 0; return; } @@ -10266,7 +10303,7 @@ void clif_parse_WeaponRefine(int fd, struct map_session_data *sd) return; if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. - clif_skill_fail(sd,sd->ud.skillid,0,0); + clif_skill_fail(sd,sd->ud.skillid,0,0,0); sd->menuskill_val = sd->menuskill_id = 0; return; } @@ -10369,7 +10406,7 @@ void clif_parse_SelectArrow(int fd,struct map_session_data *sd) return; if (pc_istrading(sd)) { //Make it fail to avoid shop exploits where you sell something different than you see. - clif_skill_fail(sd,sd->ud.skillid,0,0); + clif_skill_fail(sd,sd->ud.skillid,0,0,0); sd->menuskill_val = sd->menuskill_id = 0; return; } @@ -10575,7 +10612,7 @@ void clif_parse_CreateParty(int fd, struct map_session_data *sd) } if( battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 7 ) { - clif_skill_fail(sd,1,0,4); + clif_skill_fail(sd,1,0,4,0); return; } @@ -10596,7 +10633,7 @@ void clif_parse_CreateParty2(int fd, struct map_session_data *sd) } if( battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 7 ) { - clif_skill_fail(sd,1,0,4); + clif_skill_fail(sd,1,0,4,0); return; } |