diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/char/char.c | 2 | ||||
-rw-r--r-- | src/config/const.h | 5 | ||||
-rw-r--r-- | src/map/clif.c | 17 | ||||
-rw-r--r-- | src/map/itemdb.h | 3 | ||||
-rw-r--r-- | src/map/pc.c | 23 | ||||
-rw-r--r-- | src/map/skill.c | 123 |
6 files changed, 151 insertions, 22 deletions
diff --git a/src/char/char.c b/src/char/char.c index ac5a9a66c..edc73223a 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -3620,7 +3620,7 @@ static void char_delete2_req(int fd, struct char_session_data* sd) static void char_delete2_accept(int fd, struct char_session_data* sd) {// CH: <0829>.W <char id>.L <birth date:YYMMDD>.6B char birthdate[8+1]; - int char_id, i, k; + int char_id, i; unsigned int base_level; char* data; time_t delete_date; diff --git a/src/config/const.h b/src/config/const.h index 3e47c5207..bee8783f8 100644 --- a/src/config/const.h +++ b/src/config/const.h @@ -62,6 +62,11 @@ #ifdef RENEWAL #define MOB_FLEE(mob) ( mob->lv + mob->status.agi + 100 ) #define MOB_HIT(mob) ( mob->lv + mob->status.dex + 150 ) + #define RE_SKILL_REDUCTION(){ \ + wd.damage = battle->calc_elefix(src, target, skill_id, skill_lv, battle->calc_cardfix(BF_WEAPON, src, target, nk, s_ele, s_ele_, wd.damage, 2, wd.flag), nk, n_ele, s_ele, s_ele_, false, flag.arrow); \ + if( flag.lh ) \ + wd.damage2 = battle->calc_elefix(src, target, skill_id, skill_lv, battle->calc_cardfix(BF_WEAPON, src, target, nk, s_ele, s_ele_, wd.damage2, 3, wd.flag), nk, n_ele, s_ele, s_ele_, true, flag.arrow); \ + } #else #define MOB_FLEE(mob) ( mob->lv + mob->status.agi ) #define MOB_HIT(mob) ( mob->lv + mob->status.dex ) diff --git a/src/map/clif.c b/src/map/clif.c index 8a78edfe9..1e05ced14 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -11172,6 +11172,13 @@ void clif_parse_ChangeCart(int fd,struct map_session_data *sd) if( sd && pc->checkskill(sd, MC_CHANGECART) < 1 ) return; +#ifdef RENEWAL + if( sd->npc_id || sd->state.workinprogress&1 ){ + clif->msg(sd, 0x783); + return; + } +#endif + type = (int)RFIFOW(fd,2); #ifdef NEW_CARTS if( (type == 9 && sd->status.base_level > 131) || @@ -11425,6 +11432,13 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uint16 ski clif->pUseSkillToPos_mercenary(sd->md, sd, tick, skill_id, skill_lv, x, y, skillmoreinfo); return; } + +#ifdef RENEWAL + if( sd->state.workinprogress&1 ){ + clif->msg(sd, 0x783); // TODO look for the client date that has this message. + return; + } +#endif //Whether skill fails or not is irrelevant, the char ain't idle. [Skotlex] sd->idletime = last_tick; @@ -11529,7 +11543,9 @@ void clif_parse_UseSkillMap(int fd, struct map_session_data* sd) { uint16 skill_id = RFIFOW(fd,2); char map_name[MAP_NAME_LENGTH]; + mapindex_getmapname((char*)RFIFOP(fd,4), map_name); + sd->state.workinprogress = 0; if(skill_id != sd->menuskill_id) return; @@ -11782,6 +11798,7 @@ void clif_parse_AutoSpell(int fd,struct map_session_data *sd) return; skill->autospell(sd,RFIFOL(fd,2)); clif_menuskill_clear(sd); + sd->state.workinprogress = 0; } diff --git a/src/map/itemdb.h b/src/map/itemdb.h index dcd0ae644..db1330344 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -63,6 +63,7 @@ enum { ITEMID_THURISAZ, ITEMID_WYRD, ITEMID_HAGALAZ, + ITEMID_LUX_ANIMA = 22540, } rune_list; /** @@ -226,7 +227,7 @@ struct item_package { #define itemdb_available(n) (itemdb->search(n)->flag.available) #define itemdb_viewid(n) (itemdb->search(n)->view_id) #define itemdb_autoequip(n) (itemdb->search(n)->flag.autoequip) -#define itemdb_is_rune(n) (n >= ITEMID_NAUTHIZ && n <= ITEMID_HAGALAZ) +#define itemdb_is_rune(n) ((n >= ITEMID_NAUTHIZ && n <= ITEMID_HAGALAZ) || n == ITEMID_LUX_ANIMA) #define itemdb_is_element(n) (n >= 990 && n <= 993) #define itemdb_is_spellbook(n) (n >= 6188 && n <= 6205) #define itemdb_is_poison(n) (n >= 12717 && n <= 12724) diff --git a/src/map/pc.c b/src/map/pc.c index bbc63f031..04f72bfaa 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -861,11 +861,15 @@ int pc_isequip(struct map_session_data *sd,int n) if(item == NULL) return 0; - if(item->elv && sd->status.base_level < (unsigned int)item->elv) + if(item->elv && sd->status.base_level < (unsigned int)item->elv){ + clif->msg(sd, 0x6ED); return 0; + } #ifdef RENEWAL - if(item->elvmax && sd->status.base_level > (unsigned int)item->elvmax) + if(item->elvmax && sd->status.base_level > (unsigned int)item->elvmax){ + clif->msg(sd, 0x6ED); return 0; + } #endif if(item->sex != 2 && sd->status.sex != item->sex) return 0; @@ -4113,7 +4117,7 @@ int pc_isUseitem(struct map_session_data *sd,int n) return 0; if( (item->item_usage.flag&NOUSE_SITTING) && (pc_issit(sd) == 1) && (pc->get_group_level(sd) < item->item_usage.override) ) { - clif->msgtable(sd->fd,664); + clif->msgtable(sd->fd,0x297); //clif->colormes(sd->fd,COLOR_WHITE,msg_txt(1474)); return 0; // You cannot use this item while sitting. } @@ -4218,12 +4222,16 @@ int pc_isUseitem(struct map_session_data *sd,int n) if(item->sex != 2 && sd->status.sex != item->sex) return 0; //Required level check - if(item->elv && sd->status.base_level < (unsigned int)item->elv) + if(item->elv && sd->status.base_level < (unsigned int)item->elv){ + clif->msg(sd, 0x6EE); return 0; + } #ifdef RENEWAL - if(item->elvmax && sd->status.base_level > (unsigned int)item->elvmax) + if(item->elvmax && sd->status.base_level > (unsigned int)item->elvmax){ + clif->msg(sd, 0x6EE); return 0; + } #endif //Not equipable by class. [Skotlex] @@ -4775,6 +4783,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short mapindex, int x, int y sd->state.changemap = (sd->mapindex != mapindex); sd->state.warping = 1; + sd->state.workinprogress = 0; if( sd->state.changemap ) { // Misc map-changing settings int i; sd->state.pmap = sd->bl.m; @@ -6607,8 +6616,10 @@ void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int h skill->sit(sd,0); } - if( sd->progressbar.npc_id ) + if( sd->progressbar.npc_id ){ clif->progressbar_abort(sd); + sd->state.workinprogress = 0; + } if( sd->status.pet_id > 0 && sd->pd && battle_config.pet_damage_support ) pet_target_check(sd,src,1); diff --git a/src/map/skill.c b/src/map/skill.c index bbfe88fa7..27973a901 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1056,7 +1056,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint case LK_SPIRALPIERCE: case ML_SPIRALPIERCE: - sc_start(bl,SC_STOP,(15+skill_lv*5),0,skill->get_time2(skill_id,skill_lv)); + sc_start(bl,SC_ANKLESNARE,100,0,skill->get_time2(skill_id,skill_lv)); break; case ST_REJECTSWORD: @@ -1387,6 +1387,10 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint case MH_NEEDLE_OF_PARALYZE: sc_start(bl, SC_NEEDLE_OF_PARALYZE, 40 + (5*skill_lv), skill_lv, skill->get_time(skill_id, skill_lv)); break; + case GN_ILLUSIONDOPING: + if( sc_start(bl, SC_ILLUSIONDOPING, 10 * skill_lv, skill_lv, skill->get_time(skill_id, skill_lv)) ) //custom rate. + sc_start(bl, SC_ILLUSION, 100, skill_lv, skill->get_time(skill_id, skill_lv)); + break; } if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai) @@ -3238,6 +3242,13 @@ int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) { } } break; + case SC_ESCAPE: + if( skl->type < 4+skl->skill_lv ){ + clif->skill_damage(src,src,tick,0,0,-30000,1,skl->skill_id,skl->skill_lv,5); + skill->blown(src,src,1,unit_getdir(src),0); + skill->addtimerskill(src,tick+80,src->id,0,0,skl->skill_id,skl->skill_lv,skl->type+1,0); + } + break; case CH_PALMSTRIKE: { struct status_change* tsc = iStatus->get_sc(target); @@ -3745,6 +3756,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case KO_HUUMARANKA: case KO_MUCHANAGE: case KO_BAKURETSU: + case GN_ILLUSIONDOPING: if( flag&1 ) {//Recursive invocation // skill_area_temp[0] holds number of targets in area // skill_area_temp[1] holds the id of the original target @@ -5658,6 +5670,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case MC_CHANGECART: + if( sd ) + sd->state.workinprogress = 3; clif->skill_nodamage(src,bl,skill_id,skill_lv,1); break; @@ -6778,9 +6792,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case SA_AUTOSPELL: clif->skill_nodamage(src,bl,skill_id,skill_lv,1); - if(sd) + if(sd){ + sd->state.workinprogress = 3; clif->autospell(sd,skill_lv); - else { + }else { int maxlv=1,spellid=0; static const int spellarray[3] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT }; if(skill_lv >= 10) { @@ -7799,6 +7814,67 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } clif->skill_nodamage(src,bl,skill_id,1,1); break; + + case RK_LUXANIMA: + if( sd == NULL || sd->status.party_id == 0 || flag&1 ){ + if( src == bl ) + break; + while( skill_area_temp[5] >= 0x10 ){ + type = SC_NONE; + i = 0; + if( skill_area_temp[5]&0x10 ){ + if( dstsd ){ + i = (rnd()%100<50) ? 4 : ((rnd()%100<80) ? 3 : 2); + clif->millenniumshield(dstsd,i); + skill_area_temp[5] &= ~0x10; + type = SC_MILLENNIUMSHIELD; + } + }else if( skill_area_temp[5]&0x20 ){ + i = status_get_max_hp(bl) * 25 / 100; + status_change_clear_buffs(bl,4); + skill_area_temp[5] &= ~0x20; + status_heal(bl,i,0,1); + type = SC_REFRESH; + }else if( skill_area_temp[5]&0x40 ){ + skill_area_temp[5] &= ~0x40; + type = SC_GIANTGROWTH; + }else if( skill_area_temp[5]&0x80 ){ + if( dstsd ){ + i = sstatus->hp / 4; + if( status_charge(bl,i,0) ) + type = SC_STONEHARDSKIN; + skill_area_temp[5] &= ~0x80; + } + }else if( skill_area_temp[5]&0x100 ){ + skill_area_temp[5] &= ~0x100; + type = SC_VITALITYACTIVATION; + }else if( skill_area_temp[5]&0x200 ){ + skill_area_temp[5] &= ~0x200; + type = SC_ABUNDANCE; + } + if( type > SC_NONE ) + clif->skill_nodamage(bl, bl, skill_id, skill_lv, + sc_start4(bl, type, 100, skill_lv, i, 0, 1, skill->get_time(skill_id, skill_lv))); + } + }else if( sd ){ + if( tsc && tsc->count ){ + if(tsc->data[SC_MILLENNIUMSHIELD]) + skill_area_temp[5] |= 0x10; + if(tsc->data[SC_REFRESH]) + skill_area_temp[5] |= 0x20; + if(tsc->data[SC_GIANTGROWTH]) + skill_area_temp[5] |= 0x40; + if(tsc->data[SC_STONEHARDSKIN]) + skill_area_temp[5] |= 0x80; + if(tsc->data[SC_VITALITYACTIVATION]) + skill_area_temp[5] |= 0x100; + if(tsc->data[SC_ABUNDANCE]) + skill_area_temp[5] |= 0x200; + } + clif->skill_nodamage(src, bl, skill_id, skill_lv, 1); + party_foreachsamemap(skill->area_sub, sd, skill->get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill->castend_nodamage_id); + } + break; /** * Guilotine Cross **/ @@ -7891,13 +7967,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AB_CLEMENTIA: case AB_CANTO: - { - int bless_lv = sd ? ( pc->checkskill(sd,AL_BLESSING) + (sd->status.job_level / 10) ) : 10; - int agi_lv = sd ? ( pc->checkskill(sd,AL_INCAGI) + (sd->status.job_level / 10) ) : 10; - if( sd == NULL || sd->status.party_id == 0 || flag&1 ) - clif->skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(bl,type,100, - (skill_id == AB_CLEMENTIA)? bless_lv : (skill_id == AB_CANTO)? agi_lv : skill_lv, skill->get_time(skill_id,skill_lv))); - else if( sd ) + if( sd ) + i = skill_id == AB_CLEMENTIA ? pc->checkskill(sd,AL_BLESSING) : pc->checkskill(sd,AL_INCAGI); + if( sd == NULL || sd->status.party_id == 0 || flag&1 ) + clif->skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(bl, type, 100, i + (sd?(sd->status.job_level / 10):0), skill->get_time(skill_id,skill_lv))); + else if( sd ) { + if( !i ) + clif->skill_fail(sd,skill_id,USESKILL_FAIL,0); + else party_foreachsamemap(skill->area_sub, sd, skill->get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill->castend_nodamage_id); } break; @@ -8853,7 +8930,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SO_EL_ACTION: if( sd ) { - int duration = 3000; + int duration = 3000; if( !sd->ed ) break; sd->skill_id_old = skill_id; elemental_action(sd->ed, bl, tick); @@ -8890,6 +8967,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; + case SO_ELEMENTAL_SHIELD: + if( !sd->ed ) break; + elemental_delete(sd->ed, 0); + if( sd == NULL || sd->status.party_id == 0 || flag&1 ) + skill->unitsetting(src,MG_SAFETYWALL,skill_lv,bl->x,bl->y,0); + else if( sd ) + party_foreachsamemap(skill->area_sub, sd, skill->get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill->castend_nodamage_id); + break; + case GN_CHANGEMATERIAL: case SO_EL_ANALYSIS: if( sd ) { @@ -9528,7 +9614,6 @@ int skill_castend_map (struct map_session_data *sd, uint16 skill_id, const char unsigned short mapindex; mapindex = mapindex_name2id((char*)map); - sd->state.workinprogress = 0; if(!mapindex) { //Given map not found? clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); skill_failed(sd); @@ -9626,6 +9711,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case CR_CULTIVATION: case HW_GANBANTEIN: case LG_EARTHDRIVE: + case SC_ESCAPE: break; //Effect is displayed on respective switch case. default: if(skill->get_inf(skill_id)&INF_SELF_SKILL) @@ -10161,6 +10247,12 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui skill->castend_nodamage_id(src,src,TF_HIDING,1,tick,0x2); break; + case SC_ESCAPE: + clif->skill_nodamage(src,src,skill_id,-1,1); + skill->unitsetting(src,HT_ANKLESNARE,skill_lv,x,y,2); + skill->addtimerskill(src,tick,src->id,0,0,skill_id,skill_lv,0,0); + break; + case LG_OVERBRAND: { int width;//according to data from irowiki it actually is a square @@ -10498,6 +10590,9 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill && (src->type&battle_config.vs_traps_bctall)) target = BCT_ALL; break; + case HT_ANKLESNARE: + if( flag&2 ) + val3 = SC_ESCAPE; case HT_SHOCKWAVE: val1=skill_lv*15+10; case HT_SANDMAN: @@ -10507,7 +10602,6 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill case MA_SKIDTRAP: case HT_LANDMINE: case MA_LANDMINE: - case HT_ANKLESNARE: case HT_FLASHER: case HT_FREEZINGTRAP: case MA_FREEZINGTRAP: @@ -15450,7 +15544,7 @@ int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) { case UNT_ANKLESNARE: case UNT_ELECTRICSHOCKER: - if( group->val2 > 0 ) { + if( group->val2 > 0 || group->val3 == SC_ESCAPE ) { // Used Trap don't returns back to item skill->delunit(unit); break; @@ -16127,6 +16221,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid, case ITEMID_URUZ: D -= 500; //Rank A case ITEMID_BERKANA: + case ITEMID_LUX_ANIMA: D -= 500; //Rank S } make_per = A + B + C - D; |