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.
This commit is contained in:
aleos89 2014-04-04 15:36:36 -04:00
parent bcf73f5be3
commit e2d2494e13
12 changed files with 212 additions and 78 deletions

View File

@ -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

View File

@ -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 ===========================

View File

@ -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

View File

@ -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 ===========================

View File

@ -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

View File

@ -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)

View File

@ -55,7 +55,7 @@ struct mmo_char_server {
};
struct client_hash_node {
int group_id; ///group
unsigned int group_id; ///group
uint8 hash[16]; ///hash required for that groupid or below
struct client_hash_node *next; ///next entry
};

View File

@ -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<<tstatus->def_ele) || sd->right_weapon.def_ratio_atk_ele & (1<<ELE_ALL) ||
@ -2365,6 +2365,7 @@ static struct Damage battle_calc_element_damage(struct Damage wd, struct block_l
switch( skill_id ) {
case MC_CARTREVOLUTION: //Cart Revolution apply the element fix once more with neutral element
case KO_BAKURETSU:
wd.damage = battle_attr_fix(src, target, wd.damage, ELE_NEUTRAL, tstatus->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;

View File

@ -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,

View File

@ -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,6 +12632,9 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
case UNT_FLASHER:
case UNT_FREEZINGTRAP:
case UNT_FIREPILLAR_ACTIVE:
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);
@ -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;
}
}
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 )
{
switch(unit_id) {
case UNT_TALKIEBOX:
clif_talkiebox(bl,unit->group->valstr);
unit->group->val2 = -1;
}
else
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);
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;
}

View File

@ -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));

View File

@ -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,