From e2d2494e13621221dd5398680ffdf55fee86b972 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Fri, 4 Apr 2014 15:36:36 -0400 Subject: [PATCH] Bug Fixes * Fixed Main Frame Restructure not giving DEF bonus when wearing Madogear. (bugreport:8863) * Updated some more damage formulas for Kagerou skills. * Fixed critical damage bonus from Monster Transformation system. * Fixed Fire Trap and Ice Trap Burning/Freezing chance. * Cleaned up the visual effects for Ranger traps. * Odins Power now decreases DEF/MDEF by 40 at level 2. (bugreport:8869) * Added skill define for Overbrand's Plus Attack. * Fixed an issue with Overbrand's pierce damage placement. (bugreport:8856) * Fixed Unlimit not updating DEF/MDEF on players and increased the cooldown to 5 minutes. (bugreport:8870) * Few status icon updates. * Fixed two compile warnings when the VIP system is enabled. --- db/const.txt | 4 +- db/pre-re/skill_cast_db.txt | 2 +- db/pre-re/skill_db.txt | 1 + db/re/skill_cast_db.txt | 2 +- db/re/skill_db.txt | 1 + src/login/account.h | 2 +- src/login/login.h | 10 +-- src/map/battle.c | 56 ++++++++-------- src/map/itemdb.h | 6 ++ src/map/skill.c | 123 +++++++++++++++++++++++++++--------- src/map/status.c | 81 ++++++++++++++++++++---- src/map/status.h | 2 + 12 files changed, 212 insertions(+), 78 deletions(-) diff --git a/db/const.txt b/db/const.txt index cfd227e6db..d55d40eeb3 100644 --- a/db/const.txt +++ b/db/const.txt @@ -2486,6 +2486,8 @@ SI_ZONGZI_POUCH_TRANS 777 SI_HEAT_BARREL_AFTER 778 SI_DECORATION_OF_MUSIC 779 SI_OVERSEAEXPUP 780 +SI_CLOWN_N_GYPSY_CARD 781 +SI_OPEN_NPC_MARKET 782 SI_BEEF_RIB_STEW 783 SI_PORK_RIB_STEW 784 SI_CHUSEOK_MONDAY 785 @@ -2520,7 +2522,7 @@ SI_BS_REPAIRWEAPON_OPERATOR 813 SI_GET_MAILBOX 814 SI_JUMPINGCLAN 815 SI_JP_OTP 816 - + e_gasp 0 e_what 1 e_ho 2 diff --git a/db/pre-re/skill_cast_db.txt b/db/pre-re/skill_cast_db.txt index 94dbf4ba2d..9577f99c89 100644 --- a/db/pre-re/skill_cast_db.txt +++ b/db/pre-re/skill_cast_db.txt @@ -1271,7 +1271,7 @@ 2254,0,0,0,20000,15000,0 //-- RA_UNLIMIT -5002,1000,500,0,60000,0,240000 +5002,1000,500,0,60000,0,250000 //========================================== //===== Mechanic =========================== diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index 72344a543c..a5b0858d3e 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -1084,6 +1084,7 @@ 2324,3,8,1,-1,0,0,5,3,yes,0,0,0,weapon,0,0x0, LG_HESPERUSLIT,Hesperus Lit 2325,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_INSPIRATION,Inspiration 2519,1,6,1,-1,0x2,0,5,1,yes,0,0,0,weapon,3:4:5:6:7,0x0, LG_OVERBRAND_BRANDISH,Overbrand Brandish +2520,1,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0, LG_OVERBRAND_PLUSATK,Overbrand Plus Attack //**** // SR Sura diff --git a/db/re/skill_cast_db.txt b/db/re/skill_cast_db.txt index b5eccbc901..e24a2b3a96 100644 --- a/db/re/skill_cast_db.txt +++ b/db/re/skill_cast_db.txt @@ -1269,7 +1269,7 @@ //-- RA_ICEBOUNDTRAP 2254,0,0,0,20000,15000,0,-1 //-- RA_UNLIMIT -5002,0,500,0,60000,0,240000,1000 +5002,0,500,0,60000,0,250000,1000 //========================================== //===== Mechanic =========================== diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index 4f3e6e43cc..4efde27a8e 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -1084,6 +1084,7 @@ 2324,3,8,1,-1,0,0,5,3,yes,0,0,0,weapon,0,0x0, LG_HESPERUSLIT,Hesperus Lit 2325,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_INSPIRATION,Inspiration 2519,1,6,1,-1,0x2,0,5,1,yes,0,0,0,weapon,3:4:5:6:7,0x0, LG_OVERBRAND_BRANDISH,Overbrand Brandish +2520,1,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0, LG_OVERBRAND_PLUSATK,Overbrand Plus Attack //**** // SR Sura diff --git a/src/login/account.h b/src/login/account.h index dc9b78870e..1d56719fe2 100644 --- a/src/login/account.h +++ b/src/login/account.h @@ -40,7 +40,7 @@ struct mmo_account { char pass[32+1]; // 23+1 for plaintext, 32+1 for md5-ed passwords char sex; // gender (M/F/S) char email[40]; // e-mail (by default: a@a.com) - int group_id; // player group id + unsigned int group_id; // player group id uint8 char_slots; // this accounts maximum character slots (maximum is limited to MAX_CHARS define in char server) unsigned int state; // packet 0x006a value + 1 (0: compte OK) time_t unban_time; // (timestamp): ban time limit of the account (0 = no ban) diff --git a/src/login/login.h b/src/login/login.h index 1c06571e01..5eeeb9d6ea 100644 --- a/src/login/login.h +++ b/src/login/login.h @@ -46,8 +46,8 @@ struct login_session_data { ///Struct describing 1 char-serv attach to us struct mmo_char_server { char name[20]; ///char-serv name - int fd; ///char-serv socket (well actually file descriptor) - uint32 ip; ///char-serv IP + int fd; ///char-serv socket (well actually file descriptor) + uint32 ip; ///char-serv IP uint16 port; ///char-serv rt uint16 users; /// user count on this server uint16 type; /// 0=normal, 1=maintenance, 2=over 18, 3=paying, 4=P2P @@ -55,9 +55,9 @@ struct mmo_char_server { }; struct client_hash_node { - int group_id; ///group - uint8 hash[16]; ///hash required for that groupid or below - struct client_hash_node *next; ///next entry + unsigned int group_id; ///group + uint8 hash[16]; ///hash required for that groupid or below + struct client_hash_node *next; ///next entry }; struct Login_Config { diff --git a/src/map/battle.c b/src/map/battle.c index 21602e83e8..437d3d6373 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -1983,10 +1983,10 @@ static int is_attack_piercing(struct Damage wd, struct block_list *src, struct b struct status_data *tstatus = status_get_status_data(target); #ifdef RENEWAL if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS - && skill_id != PA_SHIELDCHAIN && skill_id != ASC_BREAKER ) // Renewal: Soul Breaker no longer gains ice pick effect and ice pick effect gets crit benefit [helvetica] + && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI && skill_id != ASC_BREAKER ) // Renewal: Soul Breaker no longer gains ice pick effect and ice pick effect gets crit benefit [helvetica] #else if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS - && skill_id != PA_SHIELDCHAIN && !is_attack_critical(wd, src, target, skill_id, skill_lv, false) ) + && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI && !is_attack_critical(wd, src, target, skill_id, skill_lv, false) ) #endif { //Elemental/Racial adjustments if( sd && (sd->right_weapon.def_ratio_atk_ele & (1<def_ele) || sd->right_weapon.def_ratio_atk_ele & (1<def_ele, tstatus->ele_lv); break; case GS_GROUNDDRIFT: @@ -2728,6 +2729,10 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.crit_atk_rate); } #endif + if(is_attack_critical(wd, src, target, skill_id, skill_lv, false) && sc && sc->data[SC_MTF_CRIDAMAGE]) { + ATK_ADDRATE(wd.damage, wd.damage2, 25); + RE_ALLATK_ADDRATE(wd, 25); //Temporary it should be 'bonus.crit_atk_rate' + } if(sd->status.party_id && (skill=pc_checkskill(sd,TK_POWER)) > 0) { if( (i = party_foreachsamemap(party_sub_count, sd, 0)) > 1 ) { // exclude the player himself [Inkfish] ATK_ADDRATE(wd.damage, wd.damage2, 2*skill*i); @@ -3624,26 +3629,36 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio += 700; break; case KO_JYUMONJIKIRI: - skillratio += -100 + 150 * skill_lv; + skillratio = 150 * skill_lv; + RE_LVL_DMOD(120); + if(tsc && tsc->data[SC_JYUMONJIKIRI]) + skillratio += skill_lv * status_get_lv(src); break; case KO_HUUMARANKA: - skillratio += -100 + 150 * skill_lv + sstatus->dex/2 + sstatus->agi/2; // needs more info + skillratio = 150 * skill_lv + sstatus->agi + sstatus->dex + (sd ? pc_checkskill(sd,NJ_HUUMA) * 100 : 0); break; case KO_SETSUDAN: skillratio += 100 * (skill_lv-1); + RE_LVL_DMOD(100); + if(tsc && tsc->data[SC_SPIRIT]) + skillratio += 200 * tsc->data[SC_SPIRIT]->val1; break; case KO_BAKURETSU: - skillratio = 50 * skill_lv * (sd?pc_checkskill(sd,NJ_TOBIDOUGU):10); + skillratio = (sd ? pc_checkskill(sd,NJ_TOBIDOUGU) : 1) * (50 + sstatus->dex / 4) * skill_lv * 4 / 10; + RE_LVL_DMOD(120); + skillratio += 10 * (sd ? sd->status.job_level : 1); + break; + case KO_MAKIBISHI: + skillratio = 20 * skill_lv; break; case MH_NEEDLE_OF_PARALYZE: skillratio += 600 + 100 * skill_lv; break; case MH_STAHL_HORN: - skillratio += 400 + 100 * skill_lv * status_get_lv(src); - skillratio = skillratio/100; //@TODO uv1 factor need to be confirmed + skillratio += 400 + 100 * skill_lv * status_get_lv(src) / 150; break; case MH_LAVA_SLIDE: - skillratio += -100 + 70 * skill_lv; + skillratio = 70 * skill_lv; break; case MH_SONIC_CRAW: skillratio = 40 * skill_lv; @@ -3797,16 +3812,6 @@ static int battle_calc_skill_constant_addition(struct Damage wd, struct block_li else atk += ( status_get_lv(target) * 50 ); //mobs break; - case KO_SETSUDAN: - if( tsc && tsc->data[SC_SPIRIT] ){ -#ifdef RENEWAL - atk = ((wd.equipAtk + wd.weaponAtk + wd.statusAtk + wd.masteryAtk) * (10*tsc->data[SC_SPIRIT]->val1)) / 100;// +10% custom value. -#else - atk = (int) ((wd.damage) * (10*tsc->data[SC_SPIRIT]->val1)) / 100;// +10% custom value. -#endif - status_change_end(target,SC_SPIRIT,INVALID_TIMER); - } - break; } return atk; } @@ -4741,8 +4746,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl if(is_attack_critical(wd, src, target, skill_id, skill_lv, false)) { if(sd) { // check for player so we don't crash out, monsters don't have bonus crit rates [helvetica] wd.damage = (int)floor((double)(wd.damage * 1.4 * (100 + sd->bonus.crit_atk_rate)) / 100); - if (sc && sc->data[SC_MTF_CRIDAMAGE]) // Monster Transformation Bonus - wd.damage *= (int)1.25; } else wd.damage = (int)floor((double)wd.damage * 1.4); @@ -4795,11 +4798,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl // skills forced to neutral gain benefits from weapon element // but final damage is considered "neutral" and resistances are applied again switch (skill_id) { - case GN_CARTCANNON: // Cart Cannon gets forced to element of cannon ball (neutral or holy/shadow/ghost) - wd.damage = battle_attr_fix(src, target, wd.damage, (sd && sd->bonus.arrow_ele) ? sd->bonus.arrow_ele : ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); - break; case MC_CARTREVOLUTION: // Cart Revolution gets forced to neutral element case MO_INVESTIGATE: + case KO_BAKURETSU: wd.damage = battle_attr_fix(src, target, wd.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); break; case CR_SHIELDBOOMERANG: @@ -4835,6 +4836,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl } } break; + case GN_CARTCANNON: // Cart Cannon gets forced to element of cannon ball (neutral or holy/shadow/ghost) + wd.damage = battle_attr_fix(src, target, wd.damage, (sd && sd->bonus.arrow_ele) ? sd->bonus.arrow_ele : ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); + break; } // perform multihit calculations @@ -5886,9 +5890,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * //[{( Hell Plant Skill Level x Casters Base Level ) x 10 } + {( Casters INT x 7 ) / 2 } x { 18 + ( Casters Job Level / 4 )] x ( 5 / ( 10 - Summon Flora Skill Level )) md.damage = ( skill_lv * status_get_lv(src) * 10 ) + ( status_get_int(src) * 7 / 2 ) * ( 18 + (sd?sd->status.job_level:0) / 4 ) * ( 5 / (10 - ((sd) ? pc_checkskill(sd,AM_CANNIBALIZE) : skill_get_max(AM_CANNIBALIZE))) ); break; - case KO_MAKIBISHI: - md.damage = 20 * skill_lv; - break; case RL_B_TRAP: md.damage = (200 + status_get_int(src) + status_get_dex(src)) * skill_lv * 10; //(custom) break; @@ -6825,6 +6826,9 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f case ASC_METEORASSAULT: case RG_RAID: case MC_CARTREVOLUTION: + case HT_CLAYMORETRAP: + case RA_ICEBOUNDTRAP: + case RA_FIRINGTRAP: #endif state |= BCT_ENEMY; strip_enemy = 0; diff --git a/src/map/itemdb.h b/src/map/itemdb.h index 3d85cdfe4b..29e674d3ac 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -73,6 +73,12 @@ enum item_itemid { ITEMID_PHRACON = 1010, ITEMID_EMVERETARCON = 1011, ITEMID_TRAP = 1065, + ITEMID_GHOSTRING_CARD = 4047, + ITEMID_PHREEONI_CARD = 4121, + ITEMID_MISTRESS_CARD = 4132, + ITEMID_ORC_LORD_CARD = 4135, + ITEMID_ORC_HERO_CARD = 4143, + ITEMID_TAO_GUNKA_CARD = 4302, ITEMID_STRANGE_EMBRYO = 6415, ITEMID_STONE = 7049, ITEMID_FIRE_BOTTLE = 7135, diff --git a/src/map/skill.c b/src/map/skill.c index ad08fb3221..f1df8c50eb 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1314,7 +1314,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint break; case RA_FIRINGTRAP: case RA_ICEBOUNDTRAP: - sc_start(src,bl, (skill_id == RA_FIRINGTRAP) ? SC_BURNING:SC_FREEZING, 40 + 10 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv)); + sc_start(src,bl, (skill_id == RA_FIRINGTRAP) ? SC_BURNING:SC_FREEZING, 50 + 10 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv)); break; case NC_PILEBUNKER: if( rnd()%100 < 25 + 15*skill_lv ) { @@ -1497,11 +1497,14 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint case EL_TYPOON_MIS: sc_start(src,bl,SC_SILENCE,10*skill_lv,skill_lv,skill_get_time(skill_id,skill_lv)); break; - case KO_JYUMONJIKIRI: // needs more info - sc_start(src,bl,SC_JYUMONJIKIRI,25,skill_lv,skill_get_time(skill_id,skill_lv)); + case KO_JYUMONJIKIRI: + sc_start(src,bl,SC_JYUMONJIKIRI,100,skill_lv,skill_get_time(skill_id,skill_lv)); + break; + case KO_SETSUDAN: + status_change_end(bl,SC_SPIRIT,INVALID_TIMER); break; case KO_MAKIBISHI: - sc_start(src,bl, SC_STUN, 100, skill_lv, skill_get_time2(skill_id,skill_lv)); + sc_start(src,bl, SC_STUN, 10 * skill_lv, skill_lv, skill_get_time2(skill_id,skill_lv)); break; case MH_LAVA_SLIDE: if (tsc && !tsc->data[SC_BURNING]) sc_start4(src,bl, SC_BURNING, 10 * skill_lv, skill_lv, 1000, src->id, 0, skill_get_time(skill_id, skill_lv)); @@ -4039,9 +4042,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case WM_SEVERE_RAINSTORM_MELEE: case WM_GREAT_ECHO: case GN_SLINGITEM_RANGEMELEEATK: - case KO_JYUMONJIKIRI: case KO_SETSUDAN: - case KO_KAIHOU: case GC_DARKCROW: case RL_MASS_SPIRAL: case RL_SLUGSHOT: @@ -4520,6 +4521,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case AB_HIGHNESSHEAL: case AB_DUPLELIGHT_MAGIC: case WM_METALICSOUND: + case KO_KAIHOU: case MH_ERASER_CUTTER: skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag); break; @@ -5152,6 +5154,30 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } break; + case KO_JYUMONJIKIRI: { + short x, y; + short dir = map_calc_dir(src,bl->x,bl->y); + + if (dir > 0 && dir < 4) + x = 2; + else if (dir > 4) + x = -2; + else + x = 0; + if (dir > 2 && dir < 6) + y = 2; + else if (dir == 7 || dir < 2) + y = -2; + else + y = 0; + if (unit_movepos(src,bl->x + x,bl->y + y,1,1)) { + clif_slide(src,bl->x + x,bl->y + y); + clif_fixpos(src); //The official server send these two packts. + skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); + } + } + break; + case EL_FIRE_BOMB: case EL_FIRE_WAVE: case EL_WATER_SCREW: @@ -11178,7 +11204,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skill_id,skill_lv,src,x,y,dir); for( i = 0; i < layout->count; i++ ) - map_foreachincell(skill_area_sub,src->m,x+layout->dx[i],y+layout->dy[i],BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id); + map_foreachincell(skill_area_sub,src->m,src->x+layout->dx[i],src->y+layout->dy[i],BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id); skill_addtimerskill(src,gettick() + status_get_amotion(src),0,0,0,LG_OVERBRAND_BRANDISH,skill_lv,dir,flag); } break; @@ -12606,7 +12632,10 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns case UNT_FLASHER: case UNT_FREEZINGTRAP: case UNT_FIREPILLAR_ACTIVE: - map_foreachinrange(skill_trap_splash,&src->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick); + if( sg->unit_id == UNT_FIRINGTRAP || sg->unit_id == UNT_ICEBOUNDTRAP || sg->unit_id == UNT_CLAYMORETRAP ) + map_foreachinrange(skill_trap_splash,&src->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag|BL_SKILL|~BCT_SELF, &src->bl,tick); + else + map_foreachinrange(skill_trap_splash,&src->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick); if (sg->unit_id != UNT_FIREPILLAR_ACTIVE) clif_changetraplook(&src->bl, sg->unit_id==UNT_LANDMINE?UNT_FIREPILLAR_ACTIVE:UNT_USED_TRAPS); sg->limit=DIFF_TICK(tick,sg->tick)+1500 + @@ -14510,15 +14539,16 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, break; case KO_ZANZOU: { int c = 0; + i = map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, 2308, skill_id, &c); - if( c >= skill_get_maxcount(skill_id,skill_lv) || c != i) - { + if( c >= skill_get_maxcount(skill_id,skill_lv) || c != i) { clif_skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0); - return false; + return false; + } } break; - } } + status = &sd->battle_status; require = skill_get_requirement(sd,skill_id,skill_lv); @@ -16007,18 +16037,23 @@ int skill_detonator(struct block_list *bl, va_list ap) case UNT_CLUSTERBOMB: case UNT_FIRINGTRAP: case UNT_ICEBOUNDTRAP: - if( unit_id == UNT_TALKIEBOX ) - { - clif_talkiebox(bl,unit->group->valstr); - unit->group->val2 = -1; + switch(unit_id) { + case UNT_TALKIEBOX: + clif_talkiebox(bl,unit->group->valstr); + unit->group->val2 = -1; + break; + case UNT_CLAYMORETRAP: + case UNT_FIRINGTRAP: + case UNT_ICEBOUNDTRAP: + map_foreachinrange(skill_trap_splash,bl,skill_get_splash(unit->group->skill_id,unit->group->skill_lv),unit->group->bl_flag|BL_SKILL|~BCT_SELF,bl,unit->group->tick); + break; + default: + map_foreachinrange(skill_trap_splash,bl,skill_get_splash(unit->group->skill_id,unit->group->skill_lv),unit->group->bl_flag,bl,unit->group->tick); } - else - map_foreachinrange(skill_trap_splash,bl,skill_get_splash(unit->group->skill_id,unit->group->skill_lv),unit->group->bl_flag,bl,unit->group->tick); - - clif_changetraplook(bl,unit_id == UNT_FIRINGTRAP ? UNT_DUMMYSKILL : UNT_USED_TRAPS); + clif_changetraplook(bl, UNT_USED_TRAPS); unit->group->unit_id = UNT_USED_TRAPS; unit->group->limit = DIFF_TICK(gettick(),unit->group->tick) + - (unit_id == UNT_TALKIEBOX ? 5000 : (unit_id == UNT_CLUSTERBOMB || unit_id == UNT_ICEBOUNDTRAP? 2500 : 1500) ); + (unit_id == UNT_TALKIEBOX ? 5000 : (unit_id == UNT_CLUSTERBOMB || unit_id == UNT_ICEBOUNDTRAP? 2500 : (unit_id == UNT_FIRINGTRAP ? 0 : 1500)) ); break; } return 0; @@ -16224,12 +16259,6 @@ static int skill_trap_splash (struct block_list *bl, va_list ap) case UNT_ELECTRICSHOCKER: clif_skill_damage(src,bl,tick,0,0,-30000,1,sg->skill_id,sg->skill_lv,5); break; - case UNT_FIRINGTRAP: - case UNT_ICEBOUNDTRAP: - case UNT_CLUSTERBOMB: - if( ss != bl ) - skill_attack(BF_MISC,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1|SD_LEVEL); - break; case UNT_MAGENTATRAP: case UNT_COBALTTRAP: case UNT_MAIZETRAP: @@ -16241,6 +16270,38 @@ static int skill_trap_splash (struct block_list *bl, va_list ap) skill_addtimerskill(ss,tick+50,bl->id,0,0,WM_REVERBERATION_MELEE,sg->skill_lv,BF_WEAPON,0); // for proper skill delay animation when use with Dominion Impulse skill_addtimerskill(ss,tick+250,bl->id,0,0,WM_REVERBERATION_MAGIC,sg->skill_lv,BF_MAGIC,0); break; + case UNT_FIRINGTRAP: + case UNT_ICEBOUNDTRAP: + if( src->id == bl->id ) break; + if( bl->type == BL_SKILL ) { + struct skill_unit *su = (struct skill_unit *)bl; + if( unit->group->unit_id == UNT_USED_TRAPS ) + break; + } + case UNT_CLUSTERBOMB: + if( ss != bl ) + skill_attack(BF_MISC,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1|SD_LEVEL); + break; + case UNT_CLAYMORETRAP: + if( src->id == bl->id ) break; + if( bl->type == BL_SKILL ) { + struct skill_unit *su = (struct skill_unit *)bl; + switch( su->group->unit_id ){ + case UNT_CLAYMORETRAP: + case UNT_LANDMINE: + case UNT_BLASTMINE: + case UNT_SHOCKWAVE: + case UNT_SANDMAN: + case UNT_FLASHER: + case UNT_FREEZINGTRAP: + case UNT_FIRINGTRAP: + case UNT_ICEBOUNDTRAP: + clif_changetraplook(bl, UNT_USED_TRAPS); + su->group->limit = DIFF_TICK(gettick(),su->group->tick) + 1500; + su->group->unit_id = UNT_USED_TRAPS; + } + break; + } default: skill_attack(skill_get_type(sg->skill_id),ss,src,bl,sg->skill_id,sg->skill_lv,tick,0); break; @@ -18292,16 +18353,18 @@ static int skill_destroy_trap( struct block_list *bl, va_list ap ) { if (su->alive && (sg = su->group) && skill_get_inf2(sg->skill_id)&INF2_TRAP) { switch( sg->unit_id ) { - case UNT_LANDMINE: case UNT_CLAYMORETRAP: + case UNT_FIRINGTRAP: + case UNT_ICEBOUNDTRAP: + map_foreachinrange(skill_trap_splash,&su->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag|BL_SKILL|~BCT_SELF, &su->bl,tick); + break; + case UNT_LANDMINE: case UNT_BLASTMINE: case UNT_SHOCKWAVE: case UNT_SANDMAN: case UNT_FLASHER: case UNT_FREEZINGTRAP: case UNT_CLUSTERBOMB: - case UNT_FIRINGTRAP: - case UNT_ICEBOUNDTRAP: map_foreachinrange(skill_trap_splash,&su->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &su->bl,tick); break; } diff --git a/src/map/status.c b/src/map/status.c index 4d628e7212..39beebf2ee 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -620,7 +620,7 @@ void initChangeTables(void) add_sc( RA_VERDURETRAP , SC_ELEMENTALCHANGE ); add_sc( RA_FIRINGTRAP , SC_BURNING ); set_sc_with_vfx( RA_ICEBOUNDTRAP, SC_FREEZING , SI_FROSTMISTY , SCB_NONE ); - set_sc( RA_UNLIMIT , SC_UNLIMIT , SI_UNLIMIT , SCB_NONE ); + set_sc( RA_UNLIMIT , SC_UNLIMIT , SI_UNLIMIT , SCB_DEF|SCB_DEF2|SCB_MDEF|SCB_MDEF2 ); /* Mechanic */ set_sc( NC_ACCELERATION , SC_ACCELERATION , SI_ACCELERATION , SCB_SPEED ); @@ -942,19 +942,24 @@ void initChangeTables(void) StatusIconChangeTable[SC_CURSED_SOIL] = SI_CURSED_SOIL; StatusIconChangeTable[SC_UPHEAVAL] = SI_UPHEAVAL; - StatusIconChangeTable[SC_PUSH_CART] = SI_ON_PUSH_CART; StatusIconChangeTable[SC_REBOUND] = SI_REBOUND; StatusIconChangeTable[SC_MONSTER_TRANSFORM] = SI_MONSTER_TRANSFORM; + StatusIconChangeTable[SC_ALL_RIDING] = SI_ALL_RIDING; + StatusIconChangeTable[SC_PUSH_CART] = SI_ON_PUSH_CART; + StatusIconChangeTable[SC_MTF_ASPD] = SI_MTF_ASPD; + StatusIconChangeTable[SC_MTF_RANGEATK] = SI_MTF_RANGEATK; + StatusIconChangeTable[SC_MTF_MATK] = SI_MTF_MATK; + StatusIconChangeTable[SC_MTF_MLEATKED] = SI_MTF_MLEATKED; + StatusIconChangeTable[SC_MTF_CRIDAMAGE] = SI_MTF_CRIDAMAGE; StatusIconChangeTable[SC_MOONSTAR] = SI_MOONSTAR; StatusIconChangeTable[SC_SUPER_STAR] = SI_SUPER_STAR; - StatusIconChangeTable[SC_STRANGELIGHTS] = SI_STRANGELIGHTS; - StatusIconChangeTable[SC_DECORATION_OF_MUSIC] = SI_DECORATION_OF_MUSIC; StatusIconChangeTable[SC_BURNING] = SI_BURNT; StatusIconChangeTable[SC_H_MINE] = SI_H_MINE; StatusIconChangeTable[SC_QD_SHOT_READY] = SI_E_QD_SHOT_READY; StatusIconChangeTable[SC_HEAT_BARREL_AFTER] = SI_HEAT_BARREL_AFTER; - + StatusIconChangeTable[SC_STRANGELIGHTS] = SI_STRANGELIGHTS; + StatusIconChangeTable[SC_DECORATION_OF_MUSIC] = SI_DECORATION_OF_MUSIC; StatusIconChangeTable[SC_QUEST_BUFF1] = SI_QUEST_BUFF1; StatusIconChangeTable[SC_QUEST_BUFF2] = SI_QUEST_BUFF2; StatusIconChangeTable[SC_QUEST_BUFF3] = SI_QUEST_BUFF3; @@ -1045,15 +1050,16 @@ void initChangeTables(void) StatusChangeFlagTable[SC_EXTRACT_SALAMINE_JUICE] |= SCB_ASPD; StatusChangeFlagTable[SC_DEFSET] |= SCB_DEF; StatusChangeFlagTable[SC_MDEFSET] |= SCB_MDEF; + StatusChangeFlagTable[SC_WEDDING] |= SCB_SPEED; + StatusChangeFlagTable[SC_ALL_RIDING] |= SCB_SPEED; + StatusChangeFlagTable[SC_PUSH_CART] |= SCB_SPEED; + StatusChangeFlagTable[SC_MTF_ASPD] |= SCB_ASPD|SCB_HIT; + StatusChangeFlagTable[SC_MTF_MATK] |= SCB_MATK; + StatusChangeFlagTable[SC_MTF_MLEATKED] |= SCB_ALL; StatusChangeFlagTable[SC_MOONSTAR] |= SCB_NONE; StatusChangeFlagTable[SC_SUPER_STAR] |= SCB_NONE; StatusChangeFlagTable[SC_STRANGELIGHTS] |= SCB_NONE; StatusChangeFlagTable[SC_DECORATION_OF_MUSIC] |= SCB_NONE; - - StatusChangeFlagTable[SC_MTF_ASPD] = SCB_ASPD|SCB_HIT; - StatusChangeFlagTable[SC_MTF_MATK] = SCB_MATK; - StatusChangeFlagTable[SC_MTF_MLEATKED] |= SCB_ALL; - StatusChangeFlagTable[SC_QUEST_BUFF1] |= SCB_BATK|SCB_MATK; StatusChangeFlagTable[SC_QUEST_BUFF2] |= SCB_BATK|SCB_MATK; StatusChangeFlagTable[SC_QUEST_BUFF3] |= SCB_BATK|SCB_MATK; @@ -3327,7 +3333,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first) status->def = cap_value(i, DEFTYPE_MIN, DEFTYPE_MAX); } - if(pc_isriding(sd) && pc_checkskill(sd, NC_MAINFRAME) > 0) + if(pc_ismadogear(sd) && pc_checkskill(sd, NC_MAINFRAME) > 0) status->def += 20 + (pc_checkskill(sd, NC_MAINFRAME) * 20); #ifndef RENEWAL @@ -5560,7 +5566,7 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2) def += 50; if(sc->data[SC_ODINS_POWER]) - def -= 20; + def -= 20 * sc->data[SC_ODINS_POWER]->val1; if( sc->data[SC_ANGRIFFS_MODUS] ) def -= 30 + 20 * sc->data[SC_ANGRIFFS_MODUS]->val1; if(sc->data[SC_STONEHARDSKIN]) @@ -5733,7 +5739,7 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, return 0; } if (sc->data[SC_ODINS_POWER]) - mdef -= 20; + mdef -= 20 * sc->data[SC_ODINS_POWER]->val1; if(sc->data[SC_UNLIMIT]) return 1; @@ -9877,6 +9883,31 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if (!map_flag_gvg(bl->m)) unit_stop_walking(bl, 1); break; + /* Show Buff Icons */ + case SC_ITEMSCRIPT: + if (sd) { + switch (val1) { + case ITEMID_GHOSTRING_CARD: + clif_status_change(bl, SI_ARMOR_PROPERTY, 1, tick, 0, 0, 0); + break; + case ITEMID_PHREEONI_CARD: + clif_status_change(bl, SI_FOODHIT, 1, tick, 0, 0, 0); + break; + case ITEMID_MISTRESS_CARD: + clif_status_change(bl, SI_MVPCARD_MISTRESS, 1, tick, 0, 0, 0); + break; + case ITEMID_ORC_LORD_CARD: + clif_status_change(bl, SI_MVPCARD_ORCLORD, 1, tick, 0, 0, 0); + break; + case ITEMID_ORC_HERO_CARD: + clif_status_change(bl, SI_MVPCARD_ORCHERO, 1, tick, 0, 0, 0); + break; + case ITEMID_TAO_GUNKA_CARD: + clif_status_change(bl, SI_MVPCARD_TAOGUNKA, 1, tick, 0, 0, 0); + break; + } + } + break; } // Set option as needed. @@ -10778,6 +10809,30 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const case SC_FULL_THROTTLE: sc_start(bl, bl, SC_REBOUND, 100, sce->val1, skill_get_time2(ALL_FULL_THROTTLE, sce->val1)); break; + case SC_ITEMSCRIPT: + if (sd) { + switch (sce->val1) { + case ITEMID_GHOSTRING_CARD: + clif_status_load(bl, SI_ARMOR_PROPERTY, 0); + break; + case ITEMID_PHREEONI_CARD: + clif_status_load(bl, SI_FOODHIT, 0); + break; + case ITEMID_MISTRESS_CARD: + clif_status_load(bl, SI_MVPCARD_MISTRESS, 0); + break; + case ITEMID_ORC_LORD_CARD: + clif_status_load(bl, SI_MVPCARD_ORCLORD, 0); + break; + case ITEMID_ORC_HERO_CARD: + clif_status_load(bl, SI_MVPCARD_ORCHERO, 0); + break; + case ITEMID_TAO_GUNKA_CARD: + clif_status_load(bl, SI_MVPCARD_TAOGUNKA, 0); + break; + } + } + break; case SC_HEAT_BARREL: if (sd) sc_start(bl,bl,SC_HEAT_BARREL_AFTER,100,sce->val1,skill_get_time2(RL_HEAT_BARREL, sce->val1)); diff --git a/src/map/status.h b/src/map/status.h index 3da32d93d8..e2dd79c88a 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -1482,6 +1482,8 @@ enum si_type { SI_HEAT_BARREL_AFTER = 778, SI_DECORATION_OF_MUSIC = 779, SI_OVERSEAEXPUP = 780, + SI_CLOWN_N_GYPSY_CARD = 781, + SI_OPEN_NPC_MARKET = 782, SI_BEEF_RIB_STEW = 783, SI_PORK_RIB_STEW = 784, SI_CHUSEOK_MONDAY = 785,