diff --git a/conf/atcommands.yml b/conf/atcommands.yml index b034d35c9c..c9f68d80ab 100644 --- a/conf/atcommands.yml +++ b/conf/atcommands.yml @@ -1032,6 +1032,11 @@ Body: - Command: setcard Help: | Adds a card or enchant to the specific slot of the equipment. + - Command: resetcooltime + Aliases: + - resetcooldown + Help: | + Resets the cooldown of all skills of the player and if active also of the homunculus or the mercenary. Footer: Imports: diff --git a/conf/msg_conf/map_msg.conf b/conf/msg_conf/map_msg.conf index beaa6f074e..7968680bd3 100644 --- a/conf/msg_conf/map_msg.conf +++ b/conf/msg_conf/map_msg.conf @@ -1823,5 +1823,8 @@ 1534: Usage: @stockall {} 1535: %d items are transferred (%d skipped)! +1536: Log configuration has been reloaded. +1537: Found skill '%s', unblocking... + //Custom translations import: conf/msg_conf/import/map_msg_eng_conf.txt diff --git a/db/re/enchantgrade.yml b/db/re/enchantgrade.yml index 29a9fc7454..abf116b452 100644 --- a/db/re/enchantgrade.yml +++ b/db/re/enchantgrade.yml @@ -76,15 +76,15 @@ Body: - Refine: 15 Chance: 7000 - Refine: 16 - Chance: 7000 + Chance: 8000 - Refine: 17 - Chance: 7000 + Chance: 8000 - Refine: 18 - Chance: 7000 + Chance: 8000 - Refine: 19 - Chance: 7000 + Chance: 8000 - Refine: 20 - Chance: 7000 + Chance: 8000 Bonus: 10 Catalyst: Item: Blessed_Etel_Dust @@ -116,15 +116,15 @@ Body: - Refine: 15 Chance: 6000 - Refine: 16 - Chance: 6000 + Chance: 7000 - Refine: 17 - Chance: 6000 + Chance: 7000 - Refine: 18 - Chance: 6000 + Chance: 7000 - Refine: 19 - Chance: 6000 + Chance: 7000 - Refine: 20 - Chance: 6000 + Chance: 7000 Bonus: 30 Catalyst: Item: Blessed_Etel_Dust @@ -154,15 +154,15 @@ Body: - Refine: 15 Chance: 5000 - Refine: 16 - Chance: 5000 + Chance: 6000 - Refine: 17 - Chance: 5000 + Chance: 6000 - Refine: 18 - Chance: 5000 + Chance: 6000 - Refine: 19 - Chance: 5000 + Chance: 6000 - Refine: 20 - Chance: 5000 + Chance: 6000 Bonus: 50 AnnounceFail: true Catalyst: @@ -193,15 +193,15 @@ Body: - Refine: 15 Chance: 4000 - Refine: 16 - Chance: 4000 + Chance: 5000 - Refine: 17 - Chance: 4000 + Chance: 5000 - Refine: 18 - Chance: 4000 + Chance: 5000 - Refine: 19 - Chance: 4000 + Chance: 5000 - Refine: 20 - Chance: 4000 + Chance: 5000 Bonus: 100 AnnounceFail: true Catalyst: @@ -240,15 +240,15 @@ Body: - Refine: 15 Chance: 7000 - Refine: 16 - Chance: 7000 + Chance: 8000 - Refine: 17 - Chance: 7000 + Chance: 8000 - Refine: 18 - Chance: 7000 + Chance: 8000 - Refine: 19 - Chance: 7000 + Chance: 8000 - Refine: 20 - Chance: 7000 + Chance: 8000 Bonus: 10 Catalyst: Item: Blessed_Etel_Dust @@ -280,15 +280,15 @@ Body: - Refine: 15 Chance: 6000 - Refine: 16 - Chance: 6000 + Chance: 7000 - Refine: 17 - Chance: 6000 + Chance: 7000 - Refine: 18 - Chance: 6000 + Chance: 7000 - Refine: 19 - Chance: 6000 + Chance: 7000 - Refine: 20 - Chance: 6000 + Chance: 7000 Bonus: 30 Catalyst: Item: Blessed_Etel_Dust @@ -318,15 +318,15 @@ Body: - Refine: 15 Chance: 5000 - Refine: 16 - Chance: 5000 + Chance: 6000 - Refine: 17 - Chance: 5000 + Chance: 6000 - Refine: 18 - Chance: 5000 + Chance: 6000 - Refine: 19 - Chance: 5000 + Chance: 6000 - Refine: 20 - Chance: 5000 + Chance: 6000 Bonus: 50 AnnounceFail: true Catalyst: @@ -357,15 +357,15 @@ Body: - Refine: 15 Chance: 4000 - Refine: 16 - Chance: 4000 + Chance: 5000 - Refine: 17 - Chance: 4000 + Chance: 5000 - Refine: 18 - Chance: 4000 + Chance: 5000 - Refine: 19 - Chance: 4000 + Chance: 5000 - Refine: 20 - Chance: 4000 + Chance: 5000 Bonus: 100 AnnounceFail: true Catalyst: diff --git a/db/re/item_db_equip.yml b/db/re/item_db_equip.yml index 639b3f117f..021aee7618 100644 --- a/db/re/item_db_equip.yml +++ b/db/re/item_db_equip.yml @@ -83053,7 +83053,7 @@ Body: Hunter: true Rogue: true Locations: - Right_Hand: true + Both_Hand: true WeaponLevel: 4 EquipLevelMin: 70 Refineable: true @@ -139532,7 +139532,7 @@ Body: AegisName: Ein_BHAXE Name: Saw Axe Type: Weapon - SubType: 1hAxe + SubType: 2hAxe Weight: 5000 Attack: 350 Range: 1 @@ -169197,6 +169197,8 @@ Body: Defense: 12 Slots: 1 Jobs: + Crusader: true + Knight: true Swordman: true Classes: All_Upper: true @@ -169217,6 +169219,8 @@ Body: Defense: 12 Slots: 1 Jobs: + Crusader: true + Knight: true Swordman: true Classes: All_Upper: true diff --git a/db/re/status.yml b/db/re/status.yml index ce888854d3..73e96067b6 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -7022,7 +7022,9 @@ Body: CalcFlags: Regen: true - Status: Earthshaker + Icon: EFST_EARTHSHAKER Flags: + BlEffect: true NoWarning: true - Status: Weaponblock_On Icon: EFST_WEAPONBLOCK_ON @@ -7037,6 +7039,7 @@ Body: Icon: EFST_SPORE_EXPLOSION_DEBUFF DurationLookup: GN_SPORE_EXPLOSION Flags: + BlEffect: true NoDispell: true NoBanishingBuster: true NoClearance: true diff --git a/doc/atcommands.txt b/doc/atcommands.txt index 077c630735..2f2abcc5d1 100644 --- a/doc/atcommands.txt +++ b/doc/atcommands.txt @@ -1250,6 +1250,11 @@ Adds a card or enchant to the specific slot of the equipment. --------------------------------------- +@resetcooltime +/resetcooltime + +Resets the cooldown of all skills of the player and if active also of the homunculus or the mercenary. + ============================== | 5. Administrative Commands | ============================== diff --git a/npc/re/mobs/dungeons/slabw01.txt b/npc/re/mobs/dungeons/slabw01.txt index 22d2d07756..75e374dfdd 100644 --- a/npc/re/mobs/dungeons/slabw01.txt +++ b/npc/re/mobs/dungeons/slabw01.txt @@ -5,9 +5,9 @@ //===== Additional Comments: ================================= //= 1.0 First version. // Venomous Chimera spawn timer is custom. [Capuche] +//= 1.1 Updated Venomous Chimera spawn timer. [Capuche] //============================================================ slabw01 monster Human Chimera 3631,45 slabw01 monster Material Chimera 3632,45 -// unknown timer -slabw01 monster Venomous Chimera 3633,1,18000000,600000,0 +slabw01 boss_monster Venomous Chimera 3633,1,3600000,600000,0 diff --git a/sql-files/main.sql b/sql-files/main.sql index 95cdbf23a6..2cd27e886b 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -527,6 +527,7 @@ CREATE TABLE IF NOT EXISTS `guild_expulsion` ( `account_id` int(11) unsigned NOT NULL default '0', `name` varchar(24) NOT NULL default '', `mes` varchar(40) NOT NULL default '', + `char_id` int(11) unsigned NOT NULL default '0', PRIMARY KEY (`guild_id`,`name`) ) ENGINE=MyISAM; diff --git a/sql-files/upgrades/upgrade_20240914.sql b/sql-files/upgrades/upgrade_20240914.sql new file mode 100644 index 0000000000..d2222569da --- /dev/null +++ b/sql-files/upgrades/upgrade_20240914.sql @@ -0,0 +1 @@ +ALTER TABLE `guild_expulsion` ADD COLUMN `char_id` int(11) unsigned NOT NULL default '0'; diff --git a/src/char/char.cpp b/src/char/char.cpp index 5298b4c714..cf54c99888 100644 --- a/src/char/char.cpp +++ b/src/char/char.cpp @@ -2425,7 +2425,7 @@ bool char_checkdb(void){ return false; } //checking guild_expulsion_db - if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){ + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`name`,`mes`,`char_id` FROM `%s` LIMIT 1;", schema_config.guild_expulsion_db) ){ Sql_ShowDebug(sql_handle); return false; } diff --git a/src/char/int_guild.cpp b/src/char/int_guild.cpp index 01cce53e97..9a9343791d 100644 --- a/src/char/int_guild.cpp +++ b/src/char/int_guild.cpp @@ -308,8 +308,8 @@ int inter_guild_tosql( mmo_guild &g, int flag ){ Sql_EscapeStringLen(sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH)); Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes))); - if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`) " - "VALUES ('%d','%d','%s','%s')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes) ) + if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`,`char_id`) " + "VALUES ('%u','%u','%s','%s','%u')", schema_config.guild_expulsion_db, g.guild_id, e->account_id, esc_name, esc_mes, e->char_id) ) Sql_ShowDebug(sql_handle); } } @@ -487,7 +487,7 @@ std::shared_ptr inter_guild_fromsql( int32 guild_id ){ } //printf("- Read guild_expulsion %d from sql \n",guild_id); - if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes` FROM `%s` WHERE `guild_id`='%d'", schema_config.guild_expulsion_db, guild_id) ) + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name`,`mes`,`char_id` FROM `%s` WHERE `guild_id`='%d'", schema_config.guild_expulsion_db, guild_id) ) { Sql_ShowDebug(sql_handle); return nullptr; @@ -499,6 +499,7 @@ std::shared_ptr inter_guild_fromsql( int32 guild_id ){ Sql_GetData(sql_handle, 0, &data, nullptr); e->account_id = atoi(data); Sql_GetData(sql_handle, 1, &data, &len); memcpy(e->name, data, zmin(len, NAME_LENGTH)); Sql_GetData(sql_handle, 2, &data, &len); memcpy(e->mes, data, zmin(len, sizeof(e->mes))); + Sql_GetData(sql_handle, 3, &data, nullptr); e->char_id = strtoul(data, nullptr, 10); } //printf("- Read guild_skill %d from sql \n",guild_id); @@ -1343,6 +1344,7 @@ int mapif_parse_GuildLeave(int fd, int guild_id, uint32 account_id, uint32 char_ } // Save the expulsion entry g->guild.expulsion[j].account_id = account_id; + g->guild.expulsion[j].char_id = char_id; safestrncpy(g->guild.expulsion[j].name, g->guild.member[i].name, NAME_LENGTH); safestrncpy(g->guild.expulsion[j].mes, mes, 40); } diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index 671f40b09f..a6d470bda5 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -741,6 +741,7 @@ struct guild_expulsion { char name[NAME_LENGTH]; char mes[40]; uint32 account_id; + uint32 char_id; }; struct guild_skill { diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index 3109e4de68..d68bd151d8 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -1150,6 +1150,51 @@ ACMD_FUNC(hide) return 0; } +ACMD_FUNC(resetcooltime) +{ + nullpo_retr(-1, sd); + + for( size_t i = 0; i < ARRAYLENGTH( sd->scd ); i++ ){ + if( sd->scd[i] != nullptr ) { + sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( sd->scd[i]->skill_id )->name ); // Found skill '%s', unblocking... + clif_displaymessage( sd->fd, atcmd_output ); + + if (battle_config.display_status_timers) + clif_skill_cooldown( *sd, sd->scd[i]->skill_id, 0 ); + + delete_timer(sd->scd[i]->timer, skill_blockpc_end); + aFree(sd->scd[i]); + sd->scd[i] = nullptr; + } + } + + if( sd->hd != nullptr && hom_is_active( sd->hd ) ){ + for( const uint16& skill_id : sd->hd->blockskill ){ + sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( skill_id )->name ); // Found skill '%s', unblocking... + clif_displaymessage( sd->fd, atcmd_output ); + + if (battle_config.display_status_timers) + clif_skill_cooldown( *sd, skill_id, 0 ); + } + + sd->hd->blockskill.clear(); + } + + if( sd->md != nullptr ){ + for( const uint16& skill_id : sd->md->blockskill ){ + sprintf( atcmd_output, msg_txt( sd, 1537 ), skill_db.find( skill_id )->name ); // Found skill '%s', unblocking... + clif_displaymessage( sd->fd, atcmd_output ); + + if (battle_config.display_status_timers) + clif_skill_cooldown( *sd, skill_id, 0 ); + } + + sd->md->blockskill.clear(); + } + + return 0; +} + /*========================================== * Changes a character's class *------------------------------------------*/ @@ -1241,7 +1286,7 @@ ACMD_FUNC(alive) clif_displaymessage(fd, msg_txt(sd,667)); // You're not dead. return -1; } - clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1); + clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4); clif_displaymessage(fd, msg_txt(sd,16)); // You've been revived! It's a miracle! return 0; } @@ -3547,7 +3592,7 @@ static void atcommand_raise_sub(map_session_data* sd) { status_revive(&sd->bl, 100, 100); - clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1); + clif_skill_nodamage(&sd->bl,sd->bl,ALL_RESURRECTION,4); clif_displaymessage(sd->fd, msg_txt(sd,63)); // Mercy has been shown. } @@ -3747,7 +3792,7 @@ ACMD_FUNC(lostskill) sd->status.skill[sk_idx].lv = 0; sd->status.skill[sk_idx].flag = SKILL_FLAG_PERMANENT; - clif_deleteskill(sd,skill_id); + clif_deleteskill(*sd,skill_id); clif_displaymessage(fd, msg_txt(sd,71)); // You have forgotten the skill. return 0; @@ -4330,6 +4375,9 @@ ACMD_FUNC(reload) { }else if( strstr( command, "barterdb" ) || strncmp( message, "barterdb", 4 ) == 0 ){ barter_db.reload(); clif_displaymessage(fd, msg_txt(sd, 830)); // Barter database has been reloaded. + } else if (strstr(command, "logconf") || strncmp(message, "logconf", 3) == 0) { + log_config_read(LOG_CONF_NAME); + clif_displaymessage(fd, msg_txt(sd,1536)); // Log configuration has been reloaded. } return 0; @@ -6269,7 +6317,7 @@ ACMD_FUNC(displayskill) if (type == 0 || type == 2) clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH); if (type == 0 || type == 3) - clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1); + clif_skill_nodamage(&sd->bl, sd->bl, skill_id, skill_lv); if (type == 0 || type == 4) clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick); return 0; @@ -11016,6 +11064,7 @@ void atcommand_basecommands(void) { ACMD_DEF(guildstorage), ACMD_DEF(option), ACMD_DEF(hide), // + /hide + ACMD_DEF(resetcooltime), // + /resetcooltime ACMD_DEFR(jobchange, ATCMD_NOCONSOLE), ACMD_DEF(kill), ACMD_DEF(alive), diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 52cf218c58..6f7cff4eef 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1290,7 +1290,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe // Weapon Blocking can be triggered while the above statuses are active. if ((sce = sc->getSCE(SC_WEAPONBLOCKING)) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) { - clif_skill_nodamage(target, src, GC_WEAPONBLOCKING, sce->val1, 1); + clif_skill_nodamage(target, *src, GC_WEAPONBLOCKING, sce->val1); sc_start(src, target, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, sce->val1)); d->dmg_lv = ATK_BLOCK; return false; @@ -1407,12 +1407,12 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == target->id)) && check_distance_bl(target, d_bl, sce_d->val3)) { //If player is target of devotion, show guard effect on the devotion caster rather than the target - clif_skill_nodamage(d_bl, d_bl, CR_AUTOGUARD, sce->val1, 1); + clif_skill_nodamage(d_bl, *d_bl, CR_AUTOGUARD, sce->val1); unit_set_walkdelay(d_bl, gettick(), delay, 1); d->dmg_lv = ATK_MISS; return false; } else { - clif_skill_nodamage(target, target, CR_AUTOGUARD, sce->val1, 1); + clif_skill_nodamage(target, *target, CR_AUTOGUARD, sce->val1); unit_set_walkdelay(target, gettick(), delay, 1); #ifdef RENEWAL if (sc->getSCE(SC_SHRINK)) @@ -1455,7 +1455,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe return false; if ((sce = sc->getSCE(SC_PARRYING)) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd() % 100 < sce->val2) { - clif_skill_nodamage(target, target, LK_PARRYING, sce->val1, 1); + clif_skill_nodamage(target, *target, LK_PARRYING, sce->val1); if (skill_id == LK_PARRYING) { unit_data *ud = unit_bl2ud(target); @@ -1471,7 +1471,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe if (sd && pc_issit(sd)) pc_setstand(sd, true); //Stand it to dodge. - clif_skill_nodamage(target, target, TK_DODGE, 1, 1); + clif_skill_nodamage(target, *target, TK_DODGE, 1); sc_start4(src, target, SC_COMBO, 100, TK_JUMPKICK, src->id, 1, 0, 2000); return false; } @@ -6990,7 +6990,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo ) { ATK_RATER(wd->damage, 50) - clif_skill_nodamage(target,target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1,1); + clif_skill_nodamage(target, *target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1); battle_fix_damage(target,src,wd->damage,clif_damage(*target,*src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD); if (status_isdead(*target)) return; @@ -9434,7 +9434,7 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl status_change_entry *tsce = tsc->getSCE(SC_WEAPONBLOCKING); if (attack_type == BF_WEAPON && rnd() % 100 < tsce->val2) { - clif_skill_nodamage(target, bl, GC_WEAPONBLOCKING, tsce->val1, 1); + clif_skill_nodamage(target, *bl, GC_WEAPONBLOCKING, tsce->val1); sc_start(bl, target, SC_WEAPONBLOCK_ON, 100, bl->id, skill_get_time2(GC_WEAPONBLOCKING, tsce->val1)); } } @@ -9973,7 +9973,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } if (tsc && tsc->getSCE(SC_MTF_MLEATKED) && rnd()%100 < tsc->getSCE(SC_MTF_MLEATKED)->val2) - clif_skill_nodamage(target, target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1))); + clif_skill_nodamage(target, *target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1))); if(tsc && tsc->getSCE(SC_KAAHI) && tstatus->hp < tstatus->max_hp && status_charge(target, 0, tsc->getSCE(SC_KAAHI)->val3)) { int hp_heal = tstatus->max_hp - tstatus->hp; diff --git a/src/map/chat.cpp b/src/map/chat.cpp index 9dcbf966cd..8612cec409 100644 --- a/src/map/chat.cpp +++ b/src/map/chat.cpp @@ -218,7 +218,7 @@ int chat_leavechat(map_session_data* sd, bool kicked) cd->usersd[i] = cd->usersd[i+1]; if( cd->users == 0 && cd->owner->type == BL_PC ) { // Delete empty chatroom - clif_clearchat(cd, 0); + clif_clearchat(*cd); db_destroy(cd->kick_list); map_deliddb(&cd->bl); map_delblock(&cd->bl); @@ -235,7 +235,7 @@ int chat_leavechat(map_session_data* sd, bool kicked) if( leavechar == 0 && cd->owner->type == BL_PC ) { // Set and announce new owner cd->owner = (struct block_list*) cd->usersd[0]; clif_changechatowner(cd, cd->usersd[0]); - clif_clearchat(cd, 0); + clif_clearchat(*cd); //Adjust Chat location after owner has been changed. map_delblock( &cd->bl ); @@ -276,7 +276,7 @@ int chat_changechatowner(map_session_data* sd, const char* nextownername) return -1; // name not found // erase temporarily - clif_clearchat(cd,0); + clif_clearchat(*cd); // set new owner cd->owner = (struct block_list*) cd->usersd[i]; @@ -326,7 +326,7 @@ int chat_changechatstatus(map_session_data* sd, const char* title, const char* p cd->limit = min(limit, ARRAYLENGTH(cd->usersd)); cd->pub = pub; - clif_changechatstatus(cd); + clif_changechatstatus(*cd); clif_dispchat(cd,0); return 0; @@ -437,7 +437,7 @@ int chat_deletenpcchat(struct npc_data* nd) return 0; chat_npckickall(cd); - clif_clearchat(cd, 0); + clif_clearchat(*cd); map_deliddb(&cd->bl); map_delblock(&cd->bl); map_freeblock(&cd->bl); diff --git a/src/map/chrif.cpp b/src/map/chrif.cpp index 7e4e5536a8..6d060e95e6 100644 --- a/src/map/chrif.cpp +++ b/src/map/chrif.cpp @@ -1065,7 +1065,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) { sd->status.skill[idx].id = 0; sd->status.skill[idx].lv = 0; sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT; - clif_deleteskill(sd,WE_CALLBABY); + clif_deleteskill(*sd,WE_CALLBABY); } if( mother_id && ( sd = map_charid2sd(mother_id) ) != nullptr && sd->status.child == child_id ) { @@ -1073,7 +1073,7 @@ int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) { sd->status.skill[idx].id = 0; sd->status.skill[idx].lv = 0; sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT; - clif_deleteskill(sd,WE_CALLBABY); + clif_deleteskill(*sd,WE_CALLBABY); } return 0; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 54fa3ba2d6..c214847813 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -56,7 +56,6 @@ #include "skill.hpp" #include "status.hpp" #include "storage.hpp" -#include "trade.hpp" #include "unit.hpp" #include "vending.hpp" @@ -4247,35 +4246,22 @@ void clif_equipitemack( map_session_data& sd, uint8 flag, int index, int pos ){ /// 00ac .W .W .B (ZC_REQ_TAKEOFF_EQUIP_ACK) /// 08d1 .W .W .B (ZC_REQ_TAKEOFF_EQUIP_ACK2) /// 099a .W .L .B (ZC_ACK_TAKEOFF_EQUIP_V5) -/// @ok : //inversed for v2 v5 +/// @success : //inversed for v2 v5 /// 0 = failure /// 1 = success -void clif_unequipitemack(map_session_data *sd,int n,int pos,int ok) -{ - int fd, header, offs = 0; -#if PACKETVER >= 20130000 - header = 0x99a; - ok = ok ? 0 : 1; -#elif PACKETVER >= 20110824 - header = 0x8d1; - ok = ok ? 0 : 1; -#else - header = 0xac; +void clif_unequipitemack( map_session_data& sd, uint16 server_index, int32 pos, bool success ){ +#if PACKETVER >= 20110824 + success = !success; #endif - nullpo_retv(sd); - fd=sd->fd; - WFIFOHEAD(fd, packet_len(header)); - WFIFOW(fd,offs+0) = header; - WFIFOW(fd,offs+2) = n+2; -#if PACKETVER >= 20130000 - WFIFOL(fd,offs+4) = pos; - offs += 2; -#else - WFIFOW(fd,offs+4) = pos; -#endif - WFIFOB(fd,offs+6) = ok; - WFIFOSET(fd, packet_len(header)); + PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK p{}; + + p.packetType = HEADER_ZC_REQ_TAKEOFF_EQUIP_ACK; + p.index = client_index(server_index); + p.wearLocation = static_cast(pos); + p.flag = success; + + clif_send(&p,sizeof(p),&sd.bl,SELF); } @@ -4486,48 +4472,58 @@ void clif_dispchat(struct chat_data* cd, int fd) /// 1 = public /// 2 = arena (npc waiting room) /// 3 = PK zone (non-clickable) -void clif_changechatstatus(struct chat_data* cd) -{ - unsigned char buf[128]; - uint8 type; +void clif_changechatstatus(chat_data& cd) { - if( cd == nullptr || cd->usersd[0] == nullptr ) + if(cd.usersd[0] == nullptr ) return; - type = (cd->owner->type == BL_PC ) ? (cd->pub) ? 1 : 0 - : (cd->owner->type == BL_NPC) ? (cd->limit) ? 2 : 3 - : 1; + enum e_chat_flags:uint8 { + CHAT_PRIVATE = 0, + CHAT_PUBLIC, + CHAT_ARENA, + CHAT_PK + }; - WBUFW(buf, 0) = 0xdf; - WBUFW(buf, 2) = (uint16)(17 + strlen(cd->title)); - WBUFL(buf, 4) = cd->owner->id; - WBUFL(buf, 8) = cd->bl.id; - WBUFW(buf,12) = cd->limit; - WBUFW(buf,14) = (cd->owner->type == BL_NPC) ? cd->users+1 : cd->users; - WBUFB(buf,16) = type; - memcpy(WBUFCP(buf,17), cd->title, strlen(cd->title)); // not zero-terminated + PACKET_ZC_CHANGE_CHATROOM* p = reinterpret_cast( packet_buffer ); - clif_send(buf,WBUFW(buf,2),cd->owner,CHAT); + p->packetType = HEADER_ZC_CHANGE_CHATROOM; + p->packetSize = static_castpacketSize)>(sizeof(*p) + strlen(cd.title)); + p->ownerId = cd.owner->id; + p->chatId = cd.bl.id; + p->limit = cd.limit; + p->users = cd.users; + + // not zero-terminated + strncpy(p->title, cd.title, strlen(cd.title)); + + if(cd.owner->type == BL_NPC){ + // NPC itself counts as additional chat user + p->users++; + + if(cd.limit) + p->flag = CHAT_ARENA; + else + p->flag = CHAT_PK; + }else if(cd.owner->type == BL_PC && cd.pub == false){ + p->flag = CHAT_PRIVATE; + }else{ + p->flag = CHAT_PUBLIC; + } + + clif_send(p,p->packetSize,cd.owner,CHAT); } -/// Removes the chatroom (ZC_DESTROY_ROOM). -/// 00d8 .L -void clif_clearchat(struct chat_data *cd,int fd) -{ - unsigned char buf[32]; +/// Removes the chatroom +/// 00d8 .L (ZC_DESTROY_ROOM) +void clif_clearchat(chat_data &cd){ - nullpo_retv(cd); + PACKET_ZC_DESTROY_ROOM p{}; - WBUFW(buf,0) = 0xd8; - WBUFL(buf,2) = cd->bl.id; - if( session_isActive(fd) ) { - WFIFOHEAD(fd,packet_len(0xd8)); - memcpy(WFIFOP(fd,0),buf,packet_len(0xd8)); - WFIFOSET(fd,packet_len(0xd8)); - } else { - clif_send(buf,packet_len(0xd8),cd->owner,AREA_WOSC); - } + p.packetType = HEADER_ZC_DESTROY_ROOM; + p.chatId = cd.bl.id; + + clif_send(&p,sizeof(p),cd.owner,AREA_WOSC); } @@ -4659,33 +4655,27 @@ void clif_leavechat(struct chat_data* cd, map_session_data* sd, bool flag) /// Opens a trade request window from char 'name'. /// 00e5 .24B (ZC_REQ_EXCHANGE_ITEM) -/// 01f4 .24B .L .W (ZC_REQ_EXCHANGE_ITEM2) -void clif_traderequest(map_session_data* sd, const char* name) -{ - int fd = sd->fd; +/// 01f4 .24B .L .W (ZC_REQ_EXCHANGE_ITEM2) +void clif_traderequest(map_session_data& sd, const char* name){ -#if PACKETVER < 6 - WFIFOHEAD(fd,packet_len(0xe5)); - WFIFOW(fd,0) = 0xe5; - safestrncpy(WFIFOCP(fd,2), name, NAME_LENGTH); - WFIFOSET(fd,packet_len(0xe5)); -#else - map_session_data* tsd = map_id2sd(sd->trade_partner); - if( !tsd ) return; + PACKET_ZC_REQ_EXCHANGE_ITEM p{}; - WFIFOHEAD(fd,packet_len(0x1f4)); - WFIFOW(fd,0) = 0x1f4; - safestrncpy(WFIFOCP(fd,2), name, NAME_LENGTH); - WFIFOL(fd,26) = tsd->status.char_id; - WFIFOW(fd,30) = tsd->status.base_level; - WFIFOSET(fd,packet_len(0x1f4)); + p.packetType = HEADER_ZC_REQ_EXCHANGE_ITEM; + safestrncpy(p.requesterName, name, sizeof(p.requesterName)); + +#if PACKETVER > 6 + p.targetId = sd.trade_partner.id; // Client generates a random char[5] with this info + p.targetLv = sd.trade_partner.lv; #endif + + clif_send(&p,sizeof(p),&sd.bl,SELF); + } /// Reply to a trade-request. /// 00e7 .B (ZC_ACK_EXCHANGE_ITEM) -/// 01f5 .B .L .W (ZC_ACK_EXCHANGE_ITEM2) +/// 01f5 .B .L .W (ZC_ACK_EXCHANGE_ITEM2) /// result: /// 0 = Char is too far /// 1 = Character does not exist @@ -4693,23 +4683,19 @@ void clif_traderequest(map_session_data* sd, const char* name) /// 3 = Accept /// 4 = Cancel /// 5 = Busy -void clif_tradestart(map_session_data* sd, uint8 type) -{ - int fd = sd->fd; - map_session_data* tsd = map_id2sd(sd->trade_partner); - if( PACKETVER < 6 || !tsd ) { - WFIFOHEAD(fd,packet_len(0xe7)); - WFIFOW(fd,0) = 0xe7; - WFIFOB(fd,2) = type; - WFIFOSET(fd,packet_len(0xe7)); - } else { - WFIFOHEAD(fd,packet_len(0x1f5)); - WFIFOW(fd,0) = 0x1f5; - WFIFOB(fd,2) = type; - WFIFOL(fd,3) = tsd->status.char_id; - WFIFOW(fd,7) = tsd->status.base_level; - WFIFOSET(fd,packet_len(0x1f5)); - } +void clif_traderesponse( map_session_data& sd, e_ack_trade_response result ){ + + PACKET_ZC_ACK_EXCHANGE_ITEM p{}; + + p.packetType = HEADER_ZC_ACK_EXCHANGE_ITEM; + p.result = static_cast( result ); + +#if PACKETVER > 6 + p.targetId = sd.trade_partner.id; // Client generates a random char[5] with this info + p.targetLv = sd.trade_partner.lv; +#endif + + clif_send(&p,sizeof(p),&sd.bl,SELF); } @@ -5712,28 +5698,26 @@ void clif_addskill(map_session_data *sd, int skill_id) } -/// Deletes a skill from the skill tree (ZC_SKILLINFO_DELETE). -/// 0441 .W -void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock) -{ -#if PACKETVER >= 20081217 - nullpo_retv(sd); - - int fd = sd->fd; +/// Deletes a skill from the skill tree. +/// 0441 .W (ZC_SKILLINFO_DELETE) +void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock){ +#if PACKETVER >= 20081126 uint16 idx = skill_get_index(skill_id); - if (!session_isActive(fd) || !idx) + if (idx == 0) return; - WFIFOHEAD(fd,packet_len(0x441)); - WFIFOW(fd,0) = 0x441; - WFIFOW(fd,2) = skill_id; - WFIFOSET(fd,packet_len(0x441)); + PACKET_ZC_SKILLINFO_DELETE p{}; + + p.packetType = HEADER_ZC_SKILLINFO_DELETE; + p.skillID = skill_id; + + clif_send(&p,sizeof(p),&sd.bl,SELF); #endif #if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190918 if (!skip_infoblock) #endif - clif_skillinfoblock(sd); + clif_skillinfoblock(&sd); } /// Updates a skill in the skill tree (ZC_SKILLINFO_UPDATE). @@ -6090,45 +6074,35 @@ int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick /// Non-damaging skill effect -/// 011a .W .W .L .L .B (ZC_USE_SKILL). -/// 09cb .W .L .L .L .B (ZC_USE_SKILL2). -bool clif_skill_nodamage(struct block_list *src,struct block_list *dst, uint16 skill_id, int heal, t_tick tick) -{ - unsigned char buf[17]; -#if PACKETVER < 20130731 - const int cmd = 0x11a; -#else - const int cmd = 0x9cb; -#endif - int offset = 0; - bool success = ( tick != 0 ); +/// 011a .W .W .L .L .B (ZC_USE_SKILL) +/// 09cb .W .L .L .L .B (ZC_USE_SKILL2) +bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success ){ + PACKET_ZC_USE_SKILL p{}; - nullpo_ret(dst); - - WBUFW(buf,0) = cmd; - WBUFW(buf,2) = skill_id; -#if PACKETVER < 20130731 - WBUFW(buf,4) = min(heal, INT16_MAX); -#else - WBUFL(buf,4) = min(heal, INT32_MAX); - offset += 2; -#endif - WBUFL(buf,6+offset) = dst->id; - WBUFL(buf,10+offset) = src ? src->id : 0; - WBUFB(buf,14+offset) = success; - - if (disguised(dst)) { - clif_send(buf, packet_len(cmd), dst, AREA_WOS); - WBUFL(buf,6+offset) = disguised_bl_id(dst->id); - clif_send(buf, packet_len(cmd), dst, SELF); + p.PacketType = HEADER_ZC_USE_SKILL; + p.SKID = skill_id; + p.level = std::min( static_cast( heal ), std::numeric_limits::max() ); + p.targetAID = dst.id; + p.result = success; + if(src != nullptr){ + p.srcAID = src->id; + }else{ + p.srcAID = 0; + } + if (disguised(&dst)) { + clif_send(&p, sizeof(p), &dst, AREA_WOS); + p.targetAID = disguised_bl_id(dst.id); + clif_send(&p, sizeof(p), &dst, SELF); } else - clif_send(buf, packet_len(cmd), dst, AREA); + clif_send(&p, sizeof(p), &dst, AREA); - if(src && disguised(src)) { - WBUFL(buf,10+offset) = disguised_bl_id(src->id); - if (disguised(dst)) - WBUFL(buf,6+offset) = dst->id; - clif_send(buf, packet_len(cmd), src, SELF); + if(src != nullptr && disguised(src)) { + p.srcAID = disguised_bl_id(src->id); + if (disguised(&dst)){ + // It is necessary to revert the changes done above for the disguised target + p.targetAID = dst.id; + } + clif_send(&p, sizeof(p), src, SELF); } return success; @@ -6158,37 +6132,71 @@ void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,i clif_send(buf,packet_len(0x117),src,AREA); } -/// Presents a list of available warp destinations (ZC_WARPLIST). -/// 011c .W { .16B }*4 -void clif_skill_warppoint( map_session_data* sd, uint16 skill_id, uint16 skill_lv, const char* map1, const char* map2, const char* map3, const char* map4 ){ - int fd; - nullpo_retv(sd); - fd = sd->fd; +/// Presents a list of available warp destinations. +/// 011c .W { .16B }*4 (ZC_WARPLIST) +/// 0abe .W .W { .16B }*? (ZC_WARPLIST2) +void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector& maps ){ + if(maps.empty()) + return; - WFIFOHEAD(fd,packet_len(0x11c)); - WFIFOW(fd,0) = 0x11c; - WFIFOW(fd,2) = skill_id; - memset(WFIFOP(fd,4), 0x00, 4*MAP_NAME_LENGTH_EXT); - if( strcmp( "", map1 ) != 0 ){ - mapindex_getmapname_ext( map1, WFIFOCP( fd, 4 ) ); - } - if( strcmp( "", map2 ) != 0 ){ - mapindex_getmapname_ext( map2, WFIFOCP( fd, 20 ) ); - } - if( strcmp( "", map3 ) != 0 ){ - mapindex_getmapname_ext( map3, WFIFOCP( fd, 36 ) ); - } - if( strcmp( "", map4 ) != 0 ){ - mapindex_getmapname_ext( map4, WFIFOCP( fd, 52 ) ); - } - WFIFOSET(fd,packet_len(0x11c)); +#if PACKETVER_MAIN_NUM >= 20170502 || PACKETVER_RE_NUM >= 20170419 || defined(PACKETVER_ZERO) + PACKET_ZC_WARPLIST* p = reinterpret_cast( packet_buffer ); - sd->menuskill_id = skill_id; + p->packetType = HEADER_ZC_WARPLIST; + p->packetLength = sizeof( *p ); + p->skillId = skill_id; + + size_t memoCount = 0; + for( std::string& map : maps ){ + if( map.empty() ){ + continue; + } + + PACKET_ZC_WARPLIST_sub& warp = p->maps[memoCount]; + + mapindex_getmapname_ext( map.c_str(), warp.map ); + + p->packetLength += static_castpacketLength)>( sizeof( warp ) ); + memoCount++; + } + + clif_send( p, p->packetLength, &sd.bl, SELF ); +#else + PACKET_ZC_WARPLIST p = {}; + + p.packetType = HEADER_ZC_WARPLIST; + p.skillId = skill_id; + + size_t memoCount = 0, max = 4; + for( std::string& map : maps ){ + if( map.empty() ){ + continue; + } + + PACKET_ZC_WARPLIST_sub& warp = p.maps[memoCount]; + + mapindex_getmapname_ext( map.c_str(), warp.map ); + + if( memoCount++ == max ){ + break; + } + } + + for( ; memoCount < max; memoCount++ ){ + PACKET_ZC_WARPLIST_sub& warp = p.maps[memoCount]; + + strcpy( warp.map, "" ); + } + + clif_send( &p, sizeof( p ), &sd.bl, SELF ); +#endif + + sd.menuskill_id = skill_id; if (skill_id == AL_WARP) { - sd->menuskill_val = (sd->ud.skillx<<16)|sd->ud.skilly; //Store warp position here. - sd->state.workinprogress = WIP_DISABLE_ALL; + sd.menuskill_val = (sd.ud.skillx<<16)|sd.ud.skilly; //Store warp position here. + sd.state.workinprogress = WIP_DISABLE_ALL; } else - sd->menuskill_val = skill_lv; + sd.menuskill_val = skill_lv; } @@ -8664,8 +8672,8 @@ void clif_guild_send_onlineinfo(map_session_data *sd) } -/// Bitmask of enabled guild window tabs (ZC_ACK_GUILD_MENUINTERFACE). -/// 014e .L +/// Bitmask of enabled guild window tabs +/// 014e .L (ZC_ACK_GUILD_MENUINTERFACE) /// menu flag: /// 0x00 = Basic Info (always on) /// &0x01 = Member manager @@ -8674,17 +8682,18 @@ void clif_guild_send_onlineinfo(map_session_data *sd) /// &0x10 = Expulsion list /// &0x40 = Unknown (GMENUFLAG_ALLGUILDLIST) /// &0x80 = Notice -void clif_guild_masterormember(map_session_data *sd) -{ - int fd; +void clif_guild_masterormember(map_session_data& sd){ - nullpo_retv(sd); + PACKET_ZC_ACK_GUILD_MENUINTERFACE p{}; - fd=sd->fd; - WFIFOHEAD(fd,packet_len(0x14e)); - WFIFOW(fd,0) = 0x14e; - WFIFOL(fd,2) = (sd->state.gmaster_flag) ? 0xd7 : 0x57; - WFIFOSET(fd,packet_len(0x14e)); + p.packetType = HEADER_ZC_ACK_GUILD_MENUINTERFACE; + if(sd.state.gmaster_flag){ + p.menuFlag = 0xd7; + }else{ + p.menuFlag = 0x57; + } + + clif_send(&p,sizeof(p),&sd.bl,SELF); } @@ -8728,31 +8737,38 @@ void clif_guild_basicinfo( map_session_data& sd ){ } -/// Guild alliance and opposition list (ZC_MYGUILD_BASIC_INFO). -/// 014c .W { .L .L .24B }* -void clif_guild_allianceinfo(map_session_data *sd) -{ - int fd,i,c; +/// Guild alliance and opposition list +/// 014c .W { .L .L .24B }* (ZC_MYGUILD_BASIC_INFO) +void clif_guild_allianceinfo(map_session_data& sd){ + auto &g = sd.guild; - nullpo_retv(sd); - auto &g = sd->guild; - if (!g) + if (g == nullptr){ return; - - fd = sd->fd; - WFIFOHEAD(fd, MAX_GUILDALLIANCE * 32 + 4); - WFIFOW(fd, 0)=0x14c; - for(i=c=0;iguild.alliance[i]; - if(a->guild_id>0){ - WFIFOL(fd,c*32+4)=a->opposition; - WFIFOL(fd,c*32+8)=a->guild_id; - safestrncpy(WFIFOCP(fd,c*32+12),a->name,NAME_LENGTH); - c++; - } } - WFIFOW(fd, 2)=c*32+4; - WFIFOSET(fd,WFIFOW(fd,2)); + + PACKET_ZC_MYGUILD_BASIC_INFO* p = reinterpret_cast( packet_buffer ); + + p->PacketType = HEADER_ZC_MYGUILD_BASIC_INFO; + p->PacketLength = sizeof(*p); + + for(size_t i=0, c = 0;iguild.alliance[i]; + + if(a.guild_id<=0){ + continue; + } + + RELATED_GUILD_INFO& info = p->rgInfo[c]; + + info.relation = a.opposition; + info.GDID = a.guild_id; + safestrncpy(info.guildname,a.name,sizeof(info.guildname)); + + p->PacketLength += static_castPacketLength)>(sizeof(info)); + c++; + } + + clif_send(p,p->PacketLength,&sd.bl,SELF); } @@ -8835,34 +8851,36 @@ void clif_guild_positionnamelist(map_session_data *sd) } -/// Guild position information (ZC_POSITION_INFO). -/// 0160 .W { .L .L .L .L }* +/// Guild position information +/// 0160 .W { .L .L .L .L }* (ZC_POSITION_INFO) /// mode: -/// &0x01 = allow invite -/// &0x10 = allow expel +/// See enum e_guild_permission /// ranking: /// TODO -void clif_guild_positioninfolist(map_session_data *sd) -{ - int i,fd; +static void clif_guild_positioninfolist(map_session_data& sd){ + auto &g = sd.guild; - nullpo_retv(sd); - auto &g = sd->guild; - if (!g) + if (g == nullptr){ return; - - fd = sd->fd; - WFIFOHEAD(fd, MAX_GUILDPOSITION * 16 + 4); - WFIFOW(fd, 0)=0x160; - for(i=0;iguild.position[i]; - WFIFOL(fd,i*16+ 4)=i; - WFIFOL(fd,i*16+ 8)=p->mode; - WFIFOL(fd,i*16+12)=i; - WFIFOL(fd,i*16+16)=p->exp_mode; } - WFIFOW(fd, 2)=i*16+4; - WFIFOSET(fd,WFIFOW(fd,2)); + + PACKET_ZC_POSITION_INFO* p = reinterpret_cast( packet_buffer ); + + p->PacketType = HEADER_ZC_POSITION_INFO; + p->PacketLength = sizeof(*p); + + for(size_t i=0;iguild.position[i]; + + p->posInfo[i].positionID = i; + p->posInfo[i].right = gp.mode; + p->posInfo[i].ranking = i; + p->posInfo[i].payRate = gp.exp_mode; + + p->PacketLength += static_castPacketLength)>( sizeof( p->posInfo[0] ) ); + } + + clif_send(p,p->PacketLength,&sd.bl,SELF); } @@ -9096,94 +9114,95 @@ void clif_guild_expulsion( map_session_data& sd, const char* name, uint32 char_i } -/// Guild expulsion list (ZC_BAN_LIST). -/// 0163 .W { .24B .24B .40B }* -/// 0163 .W { .24B .40B }* (PACKETVER >= 20100803) -void clif_guild_expulsionlist(map_session_data* sd) -{ -#if PACKETVER < 20100803 - const int offset = NAME_LENGTH*2+40; -#else - const int offset = NAME_LENGTH+40; -#endif - int fd, i, c = 0; +/// Guild expulsion list +/// 0163 .W { .24B .24B .40B }* (ZC_BAN_LIST) +/// 0163 .W { .24B .40B }* (PACKETVER >= 20100803) (ZC_BAN_LIST) +/// 0a87 .W { .L .40B }* (ZC_BAN_LIST2) +/// 0b7c .W { .L .40B .24B }* (ZC_BAN_LIST3) +static void clif_guild_expulsionlist(map_session_data& sd){ - nullpo_retv(sd); - - auto &g = sd->guild; + auto &g = sd.guild; if (!g) return; - fd = sd->fd; + PACKET_ZC_BAN_LIST* p = reinterpret_cast( packet_buffer ); - WFIFOHEAD(fd,4 + MAX_GUILDEXPULSION * offset); - WFIFOW(fd,0) = 0x163; + p->packetType = HEADER_ZC_BAN_LIST; + p->packetLen = sizeof(*p); - for( i = 0; i < MAX_GUILDEXPULSION; i++ ) - { - struct guild_expulsion* e = &g->guild.expulsion[i]; + for( size_t i = 0, c = 0; i < MAX_GUILDEXPULSION; i++ ){ + struct guild_expulsion& e = g->guild.expulsion[i]; - if( e->account_id > 0 ) - { - safestrncpy(WFIFOCP(fd,4 + c*offset), e->name, NAME_LENGTH); -#if PACKETVER < 20100803 - memset(WFIFOP(fd,4 + c*offset+24), 0, NAME_LENGTH); // account name (not used for security reasons) - memcpy(WFIFOP(fd,4 + c*offset+48), e->mes, 40); -#else - memcpy(WFIFOP(fd,4 + c*offset+24), e->mes, 40); -#endif - c++; + if( e.account_id == 0 ){ + continue; } + + PACKET_ZC_BAN_LIST_sub& banned = p->chars[c]; + +#if PACKETVER >= 20161019 + banned.char_id = e.char_id; +#elif PACKETVER < 20100803 + // account name (not used for security reasons) + safestrncpy(banned.account_name, "", sizeof(banned.account_name)); +#endif + +#if PACKETVER >= 20200902 || PACKETVER < 20161019 + safestrncpy(banned.char_name, e.name, sizeof(banned.char_name)); +#endif + + safestrncpy(banned.message, e.mes, sizeof(banned.message)); + p->packetLen += static_castpacketLen)>(sizeof(banned)); + c++; } - WFIFOW(fd,2) = 4 + c*offset; - WFIFOSET(fd,WFIFOW(fd,2)); + + clif_send(p,p->packetLen,&sd.bl,SELF); } -/// Guild chat message (ZC_GUILD_CHAT). -/// 017f .W .?B -void clif_guild_message( const struct mmo_guild& g, uint32 account_id, const char* mes, size_t len ){ - // TODO: account_id is not used, candidate for deletion? [Ai4rei] - map_session_data *sd; - uint8 buf[256]; +/// Guild chat message +/// 017f .W .?B (ZC_GUILD_CHAT) +void clif_guild_message( const struct mmo_guild& g, const char* mes, size_t len ){ + PACKET_ZC_GUILD_CHAT *p = reinterpret_cast( packet_buffer ); + // -1 for null terminator + static const size_t max_len = CHAT_SIZE_MAX - sizeof( *p ) - 1; - if( len == 0 ) - { + map_session_data* sd = guild_getavailablesd(g); + + // Ignore this message, if no guildmember is available + if (sd == nullptr) return; - } - else if( len > sizeof(buf)-5 ) - { - ShowWarning("clif_guild_message: Truncated message '%s' (len=%d, max=%" PRIuPTR ", guild_id=%d).\n", mes, len, sizeof(buf)-5, g.guild_id); - len = sizeof(buf)-5; - } - WBUFW(buf, 0) = 0x17f; - WBUFW( buf, 2 ) = static_cast( len + 5 ); - safestrncpy(WBUFCP(buf,4), mes, len+1); + if( len == 0 ){ + return; + } else if( len > max_len ){ + ShowWarning("clif_guild_message: Truncated message '%s' (len=%" PRIuPTR ", max=%" PRIuPTR ", guild_id=%u).\n", mes, len, max_len, g.guild_id); + len = max_len; + } + p->packetType = HEADER_ZC_GUILD_CHAT; + p->packetLength = sizeof(*p); - if ((sd = guild_getavailablesd(g)) != nullptr) - clif_send(buf, WBUFW(buf,2), &sd->bl, GUILD_NOBG); + safestrncpy(p->message, mes, len+1); + p->packetLength += static_castpacketLength)>( len + 1 ); + + clif_send(p, p->packetLength, &sd->bl, GUILD_NOBG); } -/// Request for guild alliance (ZC_REQ_ALLY_GUILD). -/// 0171 .L .24B -void clif_guild_reqalliance(map_session_data *sd,uint32 account_id,const char *name) +/// Request for guild alliance +/// 0171 .L .24B (ZC_REQ_ALLY_GUILD). +void clif_guild_reqalliance(map_session_data& sd,uint32 account_id,const char *name) { - int fd; + PACKET_ZC_REQ_ALLY_GUILD p{}; - nullpo_retv(sd); + p.packetType = HEADER_ZC_REQ_ALLY_GUILD; + p.inviterId = account_id; + safestrncpy(p.inviterGuildName,name,sizeof(p.inviterGuildName)); - fd=sd->fd; - WFIFOHEAD(fd,packet_len(0x171)); - WFIFOW(fd,0)=0x171; - WFIFOL(fd,2)=account_id; - safestrncpy(WFIFOCP(fd,6),name,NAME_LENGTH); - WFIFOSET(fd,packet_len(0x171)); + clif_send(&p,sizeof(p),&sd.bl,SELF); } -/// Notifies the client about the result of a alliance request (ZC_ACK_REQ_ALLY_GUILD). -/// 0173 .B +/// Notifies the client about the result of a alliance request. +/// 0173 .B (ZC_ACK_REQ_ALLY_GUILD) /// answer: /// 0 = Already allied. /// 1 = You rejected the offer. @@ -9191,60 +9210,50 @@ void clif_guild_reqalliance(map_session_data *sd,uint32 account_id,const char *n /// 3 = They have too any alliances. /// 4 = You have too many alliances. /// 5 = Alliances are disabled. -void clif_guild_allianceack(map_session_data *sd,int flag) -{ - int fd; +void clif_guild_allianceack(map_session_data& sd,uint8 flag){ - nullpo_retv(sd); + PACKET_ZC_ACK_REQ_ALLY_GUILD p{}; - fd=sd->fd; - WFIFOHEAD(fd,packet_len(0x173)); - WFIFOW(fd,0)=0x173; - WFIFOL(fd,2)=flag; - WFIFOSET(fd,packet_len(0x173)); + p.packetType = HEADER_ZC_ACK_REQ_ALLY_GUILD; + p.flag = flag; + + clif_send(&p,sizeof(p),&sd.bl,SELF); } -/// Notifies the client that a alliance or opposition has been removed (ZC_DELETE_RELATED_GUILD). -/// 0184 .L .L +/// Notifies the client that a alliance or opposition has been removed. +/// 0184 .L .L (ZC_DELETE_RELATED_GUILD) /// relation: /// 0 = Ally /// 1 = Enemy -void clif_guild_delalliance(map_session_data *sd,int guild_id,int flag) +void clif_guild_delalliance(map_session_data& sd,uint32 guild_id,uint32 flag) { - nullpo_retv(sd); - int fd = sd->fd; + PACKET_ZC_DELETE_RELATED_GUILD p{}; - if ( !session_isActive(fd) ) - return; + p.packetType = HEADER_ZC_DELETE_RELATED_GUILD; + p.allyID = guild_id; + p.flag = flag; - WFIFOHEAD(fd,packet_len(0x184)); - WFIFOW(fd,0)=0x184; - WFIFOL(fd,2)=guild_id; - WFIFOL(fd,6)=flag; - WFIFOSET(fd,packet_len(0x184)); + clif_send(&p,sizeof(p),&sd.bl,SELF); } -/// Notifies the client about the result of a opposition request (ZC_ACK_REQ_HOSTILE_GUILD). -/// 0181 .B +/// Notifies the client about the result of a opposition request. +/// 0181 .B (ZC_ACK_REQ_HOSTILE_GUILD) /// result: /// 0 = Antagonist has been set. /// 1 = Guild has too many Antagonists. /// 2 = Already set as an Antagonist. /// 3 = Antagonists are disabled. -void clif_guild_oppositionack(map_session_data *sd,int flag) -{ - int fd; +void clif_guild_oppositionack(map_session_data& sd,uint8 flag){ - nullpo_retv(sd); + PACKET_ZC_ACK_REQ_HOSTILE_GUILD p{}; - fd=sd->fd; - WFIFOHEAD(fd,packet_len(0x181)); - WFIFOW(fd,0)=0x181; - WFIFOB(fd,2)=flag; - WFIFOSET(fd,packet_len(0x181)); + p.packetType = HEADER_ZC_ACK_REQ_HOSTILE_GUILD; + p.flag = flag; + + clif_send(&p,sizeof(p),&sd.bl,SELF); } @@ -12351,13 +12360,8 @@ void clif_parse_TradeRequest(int fd,map_session_data *sd) } if (t_sd->state.mail_writing) { - int old = sd->trade_partner; - // Fake trading - sd->trade_partner = t_sd->status.account_id; - clif_tradestart(sd, 5); - // Restore old state - sd->trade_partner = old; + clif_traderesponse(*sd,TRADE_ACK_BUSY); return; } @@ -14047,11 +14051,13 @@ void clif_parse_CreateGuild(int fd,map_session_data *sd){ } -/// Request for guild window interface permissions (CZ_REQ_GUILD_MENUINTERFACE). -/// 014d -void clif_parse_GuildCheckMaster(int fd, map_session_data *sd) -{ - clif_guild_masterormember(sd); +/// Request for guild window interface permissions +/// 014d (CZ_REQ_GUILD_MENUINTERFACE) +static void clif_parse_GuildCheckMaster(int fd, map_session_data *sd){ + if(sd == nullptr) + return; + + clif_guild_masterormember(*sd); } @@ -14075,7 +14081,7 @@ void clif_parse_GuildRequestInfo(int fd, map_session_data *sd) { case 0: // Basic Information Guild, hostile alliance information clif_guild_basicinfo( *sd ); - clif_guild_allianceinfo(sd); + clif_guild_allianceinfo(*sd); clif_guild_castle_list(*sd); break; case 1: // Members list, list job title @@ -14084,13 +14090,13 @@ void clif_parse_GuildRequestInfo(int fd, map_session_data *sd) break; case 2: // List job title, title information list clif_guild_positionnamelist(sd); - clif_guild_positioninfolist(sd); + clif_guild_positioninfolist(*sd); break; case 3: // Skill list clif_guild_skillinfo( *sd ); break; case 4: // Expulsion list - clif_guild_expulsionlist(sd); + clif_guild_expulsionlist(*sd); break; default: ShowError("clif: guild request info: unknown type %d\n", type); @@ -14774,6 +14780,19 @@ void clif_parse_GMHide(int fd, map_session_data *sd) { } +/// /resetcooltime +/// 0a88 (CZ_CMD_RESETCOOLTIME). +void clif_parse_gm_resetcooltime( int fd, map_session_data* sd ){ +#if PACKETVER_MAIN_NUM >= 20160622 || PACKETVER_RE_NUM >= 20160622 || defined(PACKETVER_ZERO) + const PACKET_CZ_CMD_RESETCOOLTIME* p = reinterpret_cast( RFIFOP( fd, 0 ) ); + char cmd[CHAT_SIZE_MAX]; + + safesnprintf(cmd,sizeof(cmd),"%cresetcooltime",atcommand_symbol); + is_atcommand(fd, sd, cmd, 1); +#endif +} + + /// Request to adjust player's manner points (CZ_REQ_GIVE_MANNER_POINT). /// 0149 .L .B .W /// type: @@ -15032,7 +15051,7 @@ void clif_parse_NoviceExplosionSpirits(int fd, map_session_data *sd) if( percent && ( percent%100 ) == 0 ) {// 10.0%, 20.0%, ..., 90.0% sc_start(&sd->bl,&sd->bl, SC_EXPLOSIONSPIRITS, 100, 17, skill_get_time(MO_EXPLOSIONSPIRITS, 5)); //Lv17-> +50 critical (noted by Poki) [Skotlex] - clif_skill_nodamage(&sd->bl, &sd->bl, MO_EXPLOSIONSPIRITS, 5, 1); // prayer always shows successful Lv5 cast and disregards noskill restrictions + clif_skill_nodamage(&sd->bl, sd->bl, MO_EXPLOSIONSPIRITS, 5); // prayer always shows successful Lv5 cast and disregards noskill restrictions } } } @@ -16206,7 +16225,7 @@ void clif_parse_Mail_beginwrite( int fd, map_session_data *sd ){ return; } - if( sd->state.storage_flag || sd->state.mail_writing || sd->trade_partner ){ + if( sd->state.storage_flag || sd->state.mail_writing || sd->state.trading ){ clif_send_Mail_beginwrite_ack(sd, name, false); return; } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 51e1f98997..ef7a253783 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -14,6 +14,7 @@ #include "packets.hpp" #include "script.hpp" +#include "trade.hpp" struct Channel; struct clan; @@ -874,7 +875,7 @@ void clif_arrow_fail( map_session_data& sd, e_action_failure type ); void clif_arrow_create_list( map_session_data& sd ); void clif_statusupack( map_session_data& sd, int32 type, bool success, int32 val = 0 ); void clif_equipitemack( map_session_data& sd, uint8 flag, int index, int pos = 0 ); // self -void clif_unequipitemack(map_session_data *sd,int n,int pos,int ok); // self +void clif_unequipitemack( map_session_data& sd, uint16 server_index, int32 pos, bool success ); void clif_misceffect( block_list& bl, e_notify_effect type ); void clif_changeoption_target(struct block_list* bl, struct block_list* target); #define clif_changeoption(bl) clif_changeoption_target(bl, nullptr) // area @@ -887,9 +888,9 @@ void clif_joinchatfail( map_session_data& sd, e_refuse_enter_room result ); void clif_joinchatok(map_session_data& sd,chat_data& cd); void clif_addchat(struct chat_data* cd,map_session_data *sd); // chat void clif_changechatowner(struct chat_data* cd, map_session_data* sd); // chat -void clif_clearchat(struct chat_data *cd,int fd); // area or fd +void clif_clearchat(chat_data &cd); void clif_leavechat(struct chat_data* cd, map_session_data* sd, bool flag); // chat -void clif_changechatstatus(struct chat_data* cd); // chat +void clif_changechatstatus(chat_data& cd); void clif_refresh_storagewindow(map_session_data *sd); void clif_refresh(map_session_data *sd); // self @@ -905,8 +906,8 @@ void clif_parse_LoadEndAck(int fd,map_session_data *sd); void clif_hotkeys_send(map_session_data *sd, int tab); // trade -void clif_traderequest(map_session_data* sd, const char* name); -void clif_tradestart(map_session_data* sd, uint8 type); +void clif_traderequest(map_session_data& sd, const char* name); +void clif_traderesponse( map_session_data& sd, e_ack_trade_response result ); void clif_tradeadditem(map_session_data* sd, map_session_data* tsd, int index, int amount); void clif_tradeitemok(map_session_data& sd, int index, e_exitem_add_result result); void clif_tradedeal_lock( map_session_data& sd, bool who ); @@ -932,7 +933,7 @@ void clif_skillinfoblock(map_session_data *sd); void clif_skillup(map_session_data *sd, uint16 skill_id, int lv, int range, int upgradable); void clif_skillinfo(map_session_data *sd,int skill_id, int inf); void clif_addskill(map_session_data *sd, int skill_id); -void clif_deleteskill(map_session_data *sd, int skill_id, bool skip_infoblock = false); +void clif_deleteskill(map_session_data& sd, uint16 skill_id, bool skip_infoblock = false); void clif_skillcasting(struct block_list* bl, int src_id, int dst_id, int dst_x, int dst_y, uint16 skill_id, uint16 skill_lv, int property, int casttime); void clif_skillcastcancel( block_list& bl ); @@ -940,10 +941,10 @@ void clif_skill_fail( map_session_data& sd, uint16 skill_id, enum useskill_fail_ void clif_skill_cooldown( map_session_data &sd, uint16 skill_id, t_tick tick ); int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int64 sdamage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type); //int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick,int sdelay,int ddelay,int damage,int div,uint16 skill_id,uint16 skill_lv,enum e_damage_type type); -bool clif_skill_nodamage(struct block_list *src,struct block_list *dst,uint16 skill_id,int heal,t_tick tick); +bool clif_skill_nodamage( block_list* src, block_list& dst, uint16 skill_id, int32 heal, bool success = true ); void clif_skill_poseffect(struct block_list *src,uint16 skill_id,int val,int x,int y,t_tick tick); void clif_skill_estimation(map_session_data *sd,struct block_list *dst); -void clif_skill_warppoint( map_session_data* sd, uint16 skill_id, uint16 skill_lv, const char* map1, const char* map2 = "", const char* map3 = "", const char* map4 = "" ); +void clif_skill_warppoint( map_session_data& sd, uint16 skill_id, uint16 skill_lv, std::vector& maps ); void clif_skill_memomessage( map_session_data& sd, e_ack_remember_warppoint_result result ); void clif_skill_teleportmessage( map_session_data& sd, e_notify_mapinfo_result result ); void clif_skill_produce_mix_list( map_session_data& sd, int skill_id, int trigger ); @@ -1040,9 +1041,9 @@ void clif_party_dead( map_session_data& sd ); // guild void clif_guild_created( map_session_data& sd, int flag ); void clif_guild_belonginfo( map_session_data& sd ); -void clif_guild_masterormember(map_session_data *sd); +void clif_guild_masterormember(map_session_data& sd); void clif_guild_basicinfo( map_session_data& sd ); -void clif_guild_allianceinfo(map_session_data *sd); +void clif_guild_allianceinfo(map_session_data& sd); void clif_guild_memberlist( map_session_data& sd ); void clif_guild_skillinfo( map_session_data& sd ); void clif_guild_send_onlineinfo(map_session_data *sd); //[LuzZza] @@ -1056,11 +1057,11 @@ void clif_guild_memberpositionchanged(const struct mmo_guild &g,int idx); void clif_guild_emblem(const map_session_data &sd, const struct mmo_guild &g); void clif_guild_emblem_area(struct block_list* bl); void clif_guild_notice( map_session_data& sd ); -void clif_guild_message( const struct mmo_guild& g, uint32 account_id, const char* mes, size_t len ); -void clif_guild_reqalliance(map_session_data *sd,uint32 account_id,const char *name); -void clif_guild_allianceack(map_session_data *sd,int flag); -void clif_guild_delalliance(map_session_data *sd,int guild_id,int flag); -void clif_guild_oppositionack(map_session_data *sd,int flag); +void clif_guild_message( const struct mmo_guild& g, const char* mes, size_t len ); +void clif_guild_reqalliance(map_session_data& sd,uint32 account_id,const char *name); +void clif_guild_allianceack(map_session_data& sd, uint8 flag); +void clif_guild_delalliance(map_session_data& sd,uint32 guild_id,uint32 flag); +void clif_guild_oppositionack(map_session_data& sd,uint8 flag); void clif_guild_broken( map_session_data& sd, int flag ); void clif_guild_xy( map_session_data& sd ); void clif_guild_xy_single( map_session_data& sd, map_session_data& tsd ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 9b49220062..17006dc619 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -46,7 +46,6 @@ parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2); parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28); parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4); - packet(0x009a,-1); parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4); packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) ); packet(0x009e,17); @@ -60,7 +59,6 @@ packet( useItemAckType, sizeof( struct PACKET_ZC_USE_ITEM_ACK ) ); parseable_packet(0x00a9,6,clif_parse_EquipItem,2,4); parseable_packet(0x00ab,4,clif_parse_UnequipItem,2); - packet(0x00ac,7); packet(0x00ae,-1); parseable_packet(0x00b2,3,clif_parse_Restart,2); parseable_packet(0x00b8,7,clif_parse_NpcSelectMenu,2,6); @@ -88,12 +86,10 @@ packet(0x00d4,-1); parseable_packet(0x00d5,-1,clif_parse_CreateChatRoom,2,4,6,7,15); packet(0x00d7,-1); - packet(0x00d8,6); parseable_packet(0x00d9,14,clif_parse_ChatAddMember,2,6); packet(0x00dc,28); packet(0x00dd,29); parseable_packet(0x00de,-1,clif_parse_ChatRoomStatusChange,2,4,6,7,15); - packet(0x00df,-1); parseable_packet(0x00e0,30,clif_parse_ChangeChatOwner,2,6); packet(0x00e1,30); parseable_packet(0x00e2,26,clif_parse_KickFromChat,2); @@ -101,7 +97,6 @@ parseable_packet(0x00e4,6,clif_parse_TradeRequest,2); packet(0x00e5,26); parseable_packet(0x00e6,3,clif_parse_TradeAck,2); - packet(0x00e7,3); parseable_packet(0x00e8,8,clif_parse_TradeAddItem,2,4); packet(0x00ea,5); parseable_packet(0x00eb,2,clif_parse_TradeOk,0); @@ -138,9 +133,7 @@ packet(0x0117,18); parseable_packet(0x0118,2,clif_parse_StopAttack,0); packet(0x0119,13); - packet(0x011a,15); parseable_packet(0x011b,20,clif_parse_UseSkillMap,2,4); - packet(0x011c,68); parseable_packet(0x011d,2,clif_parse_RequestMemo,0); packet(0x011f,16); packet( cartlistequipType, -1 ); @@ -166,9 +159,7 @@ parseable_packet(0x0149,9,clif_parse_GMReqNoChat,2,6,7); packet(0x014a,6); packet(0x014b,27); - packet(0x014c,-1); parseable_packet(0x014d,2,clif_parse_GuildCheckMaster,0); - packet(0x014e,6); parseable_packet(0x014f,6,clif_parse_GuildRequestInfo,2); packet(0x0150,110); parseable_packet(0x0151,6,clif_parse_GuildRequestEmblem,2); @@ -183,9 +174,7 @@ parseable_packet( HEADER_CZ_REQ_BAN_GUILD, sizeof( PACKET_CZ_REQ_BAN_GUILD ), clif_parse_GuildExpulsion, 0 ); parseable_packet( HEADER_CZ_REQ_DISORGANIZE_GUILD, sizeof( PACKET_CZ_REQ_DISORGANIZE_GUILD ), clif_parse_GuildBreak, 0 ); packet(0x015f,42); - packet(0x0160,-1); parseable_packet(0x0161,-1,clif_parse_GuildChangePositionInfo,2,4); - packet(0x0163,-1); packet(0x0164,-1); parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6); packet(0x0166,-1); @@ -195,9 +184,7 @@ packet(0x016d,14); parseable_packet(0x016e,186,clif_parse_GuildChangeNotice,2,6,66); parseable_packet(0x0170,14,clif_parse_GuildRequestAlliance,2,6,10); - packet(0x0171,30); parseable_packet(0x0172,10,clif_parse_GuildReplyAlliance,2,6); - packet(0x0173,3); packet(0x0174,-1); packet(0x0175,6); packet(0x0176,106); @@ -207,12 +194,9 @@ packet(0x017b,-1); parseable_packet(0x017c,6,clif_parse_InsertCard,2,4); parseable_packet(0x017e,-1,clif_parse_GuildMessage,2,4); - packet(0x017f,-1); parseable_packet(0x0180,6,clif_parse_GuildOpposition,2); - packet(0x0181,3); packet(0x0182,106); parseable_packet(0x0183,10,clif_parse_GuildDelAlliance,2,6); - packet(0x0184,10); packet(0x0185,34); packet(0x0187,6); parseable_packet(0x018a,4,clif_parse_QuitGame,2); @@ -301,8 +285,6 @@ packet(0x01f1,-1); packet(0x01f2,20); packet(0x01f3,10); - packet(0x01f4,32); - packet(0x01f5,9); packet(0x01f6,34); parseable_packet(0x01f7,14,clif_parse_Adopt_reply,2,6,10); packet(0x01f8,2); @@ -1227,7 +1209,6 @@ // 2008-11-26aSakexe #if PACKETVER >= 20081126 packet(0x01a2,37); - packet(0x0441,4); #endif // 2008-12-10aSakexe @@ -1501,7 +1482,6 @@ parseable_packet(0x0838,6,clif_parse_SolveCharName,2); parseable_packet(0x0439,8,clif_parse_UseItem,2,4); packet(0x08d2,10); - packet(0x08d1,7); #endif // 2011-11-02aRagexe @@ -1734,7 +1714,6 @@ parseable_packet(0x0978,6,clif_parse_reqworldinfo,2); packet(0x0979,50); //ackworldinfo parseable_packet(0x0998,8,clif_parse_EquipItem,2,4); // CZ_REQ_WEAR_EQUIP_V5 - packet(0x099a,9); // take_off_equipv5 packet(0x099b,8); //maptypeproperty2 // New Packets packet(0x08ff,24); // ZC_EFST_SET_ENTER @@ -1765,7 +1744,6 @@ // 2013-07-31cRagexe #if PACKETVER >= 20130731 packet(0x09ca,23); // ZC_SKILL_ENTRY5 - packet(0x09cb,17); // ZC_USE_SKILL2 #endif // 2013-08-07Ragexe @@ -1951,9 +1929,8 @@ parseable_packet( HEADER_CZ_REQ_RANDOM_COMBINE_ITEM, -1, clif_parse_laphine_synthesis, 0 ); #endif -// 2016-06-22aRagexeRE -#if PACKETVER >= 20160622 - packet(0x0A84,94); +#if PACKETVER_MAIN_NUM >= 20160622 || PACKETVER_RE_NUM >= 20160622 || defined(PACKETVER_ZERO) + parseable_packet( HEADER_CZ_CMD_RESETCOOLTIME, sizeof( PACKET_CZ_CMD_RESETCOOLTIME ), clif_parse_gm_resetcooltime, 0 ); #endif // 2016-10-12aRagexeRE diff --git a/src/map/guild.cpp b/src/map/guild.cpp index 885d1194b9..4b20ed4161 100644 --- a/src/map/guild.cpp +++ b/src/map/guild.cpp @@ -847,7 +847,7 @@ int guild_recv_info(const struct mmo_guild &sg) { sd->guild = g; sd->state.gmaster_flag = 1; clif_name_area(&sd->bl); // [LuzZza] - clif_guild_masterormember(sd); + clif_guild_masterormember(*sd); } } else { before = g->guild; @@ -963,7 +963,7 @@ bool guild_invite( map_session_data& sd, map_session_data* tsd ){ } // Checking if there no other invitation pending - if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){ + if( !battle_config.invite_request_check && ( tsd->party_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){ clif_guild_inviteack( sd, 0 ); return false; } @@ -1476,7 +1476,7 @@ int guild_recv_message( int guild_id, uint32 account_id, const char *mes, size_t auto g = guild_search(guild_id); if (!g) return 0; - clif_guild_message(g->guild,account_id,mes,len); + clif_guild_message(g->guild,mes,len); return 0; } @@ -1862,7 +1862,7 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) { // Check, is tsd guild master, if not - cancel alliance. [f0und3r] if (battle_config.guild_alliance_onlygm && !tsd->state.gmaster_flag) { - clif_guild_allianceack(sd, 5); + clif_guild_allianceack(*sd, 5); return 0; } @@ -1877,23 +1877,23 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) { return 0; if( guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance ) { - clif_guild_allianceack(sd,4); + clif_guild_allianceack(*sd,4); return 0; } if( guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance ) { - clif_guild_allianceack(sd,3); + clif_guild_allianceack(*sd,3); return 0; } if( tsd->guild_alliance>0 ){ - clif_guild_allianceack(sd,1); + clif_guild_allianceack(*sd,1); return 0; } for (i = 0; i < MAX_GUILDALLIANCE; i++) { // check if already allied if( g->guild.alliance[i].guild_id==tsd->status.guild_id && g->guild.alliance[i].opposition==0){ - clif_guild_allianceack(sd,0); + clif_guild_allianceack(*sd,0); return 0; } } @@ -1901,7 +1901,7 @@ int guild_reqalliance(map_session_data *sd,map_session_data *tsd) { tsd->guild_alliance=sd->status.guild_id; tsd->guild_alliance_account=sd->status.account_id; - clif_guild_reqalliance(tsd,sd->status.account_id,g->guild.name); + clif_guild_reqalliance(*tsd,sd->status.account_id,g->guild.name); return 0; } @@ -1914,7 +1914,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) { nullpo_ret(sd); tsd= map_id2sd( account_id ); if (!tsd) { //Character left? Cancel alliance. - clif_guild_allianceack(sd,3); + clif_guild_allianceack(*sd,3); return 0; } @@ -1928,13 +1928,13 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) { auto &tg = tsd->guild; if (!g || guild_get_alliance_count(g->guild,0) >= battle_config.max_guild_alliance) { - clif_guild_allianceack(sd,4); - clif_guild_allianceack(tsd,3); + clif_guild_allianceack(*sd,4); + clif_guild_allianceack(*tsd,3); return 0; } if (!tg || guild_get_alliance_count(tg->guild,0) >= battle_config.max_guild_alliance) { - clif_guild_allianceack(sd,3); - clif_guild_allianceack(tsd,4); + clif_guild_allianceack(*sd,3); + clif_guild_allianceack(*tsd,4); return 0; } @@ -1959,7 +1959,7 @@ int guild_reply_reqalliance(map_session_data *sd,uint32 account_id,int flag) { sd->guild_alliance=0; sd->guild_alliance_account=0; if(tsd!=nullptr) - clif_guild_allianceack(tsd,3); + clif_guild_allianceack(*tsd,3); } return 0; } @@ -1996,14 +1996,14 @@ int guild_opposition(map_session_data *sd,map_session_data *tsd) { return 0; if( guild_get_alliance_count(g->guild,1) >= battle_config.max_guild_alliance ) { - clif_guild_oppositionack(sd,1); + clif_guild_oppositionack(*sd,1); return 0; } for (i = 0; i < MAX_GUILDALLIANCE; i++) { // checking relations if(g->guild.alliance[i].guild_id==tsd->status.guild_id){ if (g->guild.alliance[i].opposition == 1) { // check if not already hostile - clif_guild_oppositionack(sd,2); + clif_guild_oppositionack(*sd,2); return 0; } if(is_agit_start()) // Prevent the changing of alliances to oppositions during WoE. @@ -2049,7 +2049,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco if (flag & 0x70) { // failure for(i=0;i<2-(flag&1);i++) if( sd[i]!=nullptr ) - clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4); + clif_guild_allianceack(*sd[i],((flag>>4)==i+1)?3:4); return 0; } @@ -2073,16 +2073,16 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco g[i]->alliance[j].guild_id = 0; } if (sd[i] != nullptr) // notify players - clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1)); + clif_guild_delalliance(*sd[i],guild_id[1-i],(flag&1)); } } if ((flag & 0x0f) == 0) { // alliance notification if( sd[1]!=nullptr ) - clif_guild_allianceack(sd[1],2); + clif_guild_allianceack(*sd[1],2); } else if ((flag & 0x0f) == 1) { // enemy notification if( sd[0]!=nullptr ) - clif_guild_oppositionack(sd[0],0); + clif_guild_oppositionack(*sd[0],0); } @@ -2091,7 +2091,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco for(j=0;jmax_member;j++) { map_session_data *sd_mem = g[i]->member[j].sd; if( sd_mem!=nullptr){ - clif_guild_allianceinfo(sd_mem); + clif_guild_allianceinfo(*sd_mem); // join ally channel if( channel_config.ally_tmpl.name[0] && (channel_config.ally_tmpl.opt&CHAN_OPT_AUTOJOIN) ) { @@ -2112,7 +2112,7 @@ int guild_broken_sub(struct mmo_guild &g, int guild_id) { if (g.alliance[i].guild_id == guild_id) { for (int j = 0; j < g.max_member; j++) { if (g.member[j].sd) - clif_guild_delalliance(g.member[j].sd, guild_id, g.alliance[i].opposition); + clif_guild_delalliance(*g.member[j].sd, guild_id, g.alliance[i].opposition); } intif_guild_alliance(g.guild_id, guild_id, 0, 0, g.alliance[i].opposition | 8); g.alliance[i].guild_id = 0; diff --git a/src/map/mob.cpp b/src/map/mob.cpp index d903ec0900..28994b3138 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -3682,7 +3682,7 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,uint16 skill_id) if (md2->state.copy_master_mode) md->status.mode = md2->status.mode; - clif_skill_nodamage(&md->bl,&md->bl,skill_id,amount,1); + clif_skill_nodamage(&md->bl,md->bl,skill_id,amount); } return 0; diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 5a35037456..2968088048 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -362,6 +362,38 @@ struct PACKET_ZC_ACK_OPEN_BANKING{ } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_ACK_OPEN_BANKING, 0x9b7) +#if PACKETVER > 6 +struct PACKET_ZC_REQ_EXCHANGE_ITEM{ + uint16 packetType; + char requesterName[NAME_LENGTH]; + uint32 targetId; + uint16 targetLv; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x1f4) +#else +struct PACKET_ZC_REQ_EXCHANGE_ITEM{ + uint16 packetType; + char requesterName[NAME_LENGTH]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_REQ_EXCHANGE_ITEM, 0x9a) +#endif + +#if PACKETVER > 6 +struct PACKET_ZC_ACK_EXCHANGE_ITEM{ + uint16 packetType; + uint8 result; + uint32 targetId; + uint16 targetLv; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0x1f5) +#else +struct PACKET_ZC_ACK_EXCHANGE_ITEM{ + uint16 packetType; + uint8 result; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_ACK_EXCHANGE_ITEM, 0xe7) +#endif + struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM { int16 packetType; uint16 index; @@ -728,6 +760,32 @@ struct PACKET_ZC_OPEN_EDITDLGSTR { } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_OPEN_EDITDLGSTR, 0x1d4) +struct PACKET_ZC_ACK_REQ_ALLY_GUILD { + int16 packetType; + uint8 flag; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_ACK_REQ_ALLY_GUILD, 0x173) + +struct PACKET_ZC_DELETE_RELATED_GUILD { + int16 packetType; + uint32 allyID; + uint32 flag; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_DELETE_RELATED_GUILD, 0x184) + +struct PACKET_ZC_REQ_ALLY_GUILD { + int16 packetType; + uint32 inviterId; + char inviterGuildName[NAME_LENGTH]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_REQ_ALLY_GUILD, 0x171) + +struct PACKET_ZC_ACK_REQ_HOSTILE_GUILD { + int16 packetType; + uint8 flag; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_ACK_REQ_HOSTILE_GUILD, 0x181) + struct PACKET_ZC_COMPASS { int16 packetType; uint32 npcId; @@ -759,6 +817,12 @@ struct PACKET_ZC_CARTOFF { } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_CARTOFF, 0x12b) +struct PACKET_ZC_ACK_GUILD_MENUINTERFACE { + int16 packetType; + int menuFlag; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_ACK_GUILD_MENUINTERFACE, 0x014e) + struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM { int16 packetType; uint32 aid; @@ -767,6 +831,13 @@ struct PACKET_ZC_NOTIFY_POSITION_TO_GUILDM { } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_NOTIFY_POSITION_TO_GUILDM, 0x1eb) +struct PACKET_ZC_GUILD_CHAT { + int16 packetType; + int16 packetLength; + char message[]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_GUILD_CHAT, 0x17f) + struct PACKET_ZC_STATUS { int16 packetType; uint16 point; @@ -846,12 +917,50 @@ struct PACKET_ZC_PAR_CHANGE_USER { } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_PAR_CHANGE_USER, 0x1ab) +struct PACKET_ZC_CHANGE_CHATROOM{ + uint16 packetType; + uint16 packetSize; + uint32 ownerId; + uint32 chatId; + uint16 limit; + uint16 users; + uint8 flag; + char title[]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_CHANGE_CHATROOM, 0xdf); + struct PACKET_ZC_EQUIP_ARROW { int16 packetType; uint16 index; } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_EQUIP_ARROW, 0x13c) +#if PACKETVER >= 20130000 +struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{ + uint16 packetType; + uint16 index; + uint32 wearLocation; + uint8 flag; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0x99a) +#elif PACKETVER >= 20110824 +struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{ + uint16 packetType; + uint16 index; + uint16 wearLocation; + uint8 flag; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0x8d1) +#else +struct PACKET_ZC_REQ_TAKEOFF_EQUIP_ACK{ + uint16 packetType; + uint16 index; + uint16 wearLocation; + bool flag; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_REQ_TAKEOFF_EQUIP_ACK, 0xac) +#endif + struct PACKET_ZC_CLOSE_STORE { int16 packetType; } __attribute__((packed)); @@ -906,6 +1015,12 @@ struct PACKET_ZC_REFUSE_ENTER_ROOM { } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_REFUSE_ENTER_ROOM, 0xda); +struct PACKET_ZC_DESTROY_ROOM { + int16 packetType; + uint32 chatId; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_DESTROY_ROOM, 0xd8); + struct PACKET_ZC_ENTER_ROOM_sub{ uint32 flag; char name[NAME_LENGTH]; @@ -1003,6 +1118,12 @@ struct PACKET_ZC_SKILL_DISAPPEAR { } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_SKILL_DISAPPEAR, 0x120); +struct PACKET_ZC_SKILLINFO_DELETE { + uint16 packetType; + uint16 skillID; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_SKILLINFO_DELETE, 0x441); + struct PACKET_ZC_SKILL_UPDATE { int16 packetType; uint32 GID; @@ -1286,6 +1407,12 @@ DEFINE_PACKET_HEADER(CZ_REQ_STYLE_CHANGE2, 0xafc) DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d) DEFINE_PACKET_HEADER(ZC_FEED_MER, 0x22f) DEFINE_PACKET_HEADER(ZC_FEED_PET, 0x1a3) +#if PACKETVER_MAIN_NUM >= 20170502 || PACKETVER_RE_NUM >= 20170419 || defined(PACKETVER_ZERO) +DEFINE_PACKET_HEADER(ZC_WARPLIST, 0xabe) +#else +DEFINE_PACKET_HEADER(ZC_WARPLIST, 0x11c) +#endif + const int16 MAX_INVENTORY_ITEM_PACKET_NORMAL = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_normal ) - ( sizeof( struct NORMALITEM_INFO ) * MAX_ITEMLIST) ) ) / sizeof( struct NORMALITEM_INFO ) ); const int16 MAX_INVENTORY_ITEM_PACKET_EQUIP = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_equip ) - ( sizeof( struct EQUIPITEM_INFO ) * MAX_ITEMLIST ) ) ) / sizeof( struct EQUIPITEM_INFO ) ); diff --git a/src/map/party.cpp b/src/map/party.cpp index d644e3937b..1e1dc4b400 100644 --- a/src/map/party.cpp +++ b/src/map/party.cpp @@ -446,7 +446,7 @@ bool party_invite( map_session_data& sd, map_session_data *tsd ){ return false; } - if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->trade_partner || tsd->adopt_invite ) ){ + if( !battle_config.invite_request_check && ( tsd->guild_invite > 0 || tsd->state.trading || tsd->adopt_invite ) ){ clif_party_invite_reply( sd, tsd->status.name, PARTY_REPLY_JOIN_OTHER_PARTY ); return false; } diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 106614f600..20fa681fbb 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -5345,7 +5345,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_ sd->status.skill[idx].flag = SKILL_FLAG_PERMANENT; if (level == 0) { //Remove skill. sd->status.skill[idx].id = 0; - clif_deleteskill(sd,skill_id); + clif_deleteskill(*sd,skill_id); } else clif_addskill(sd,skill_id); if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills. @@ -5380,7 +5380,7 @@ bool pc_skill(map_session_data* sd, uint16 skill_id, int level, enum e_addskill_ sd->status.skill[idx].flag = SKILL_FLAG_PERM_GRANTED; if (level == 0) { //Remove skill. sd->status.skill[idx].id = 0; - clif_deleteskill(sd,skill_id); + clif_deleteskill(*sd,skill_id); } else clif_addskill(sd,skill_id); if (!skill_get_inf(skill_id) || pc_checkskill_summoner(sd, SUMMONER_POWER_LAND) >= 20 || pc_checkskill_summoner(sd, SUMMONER_POWER_SEA) >= 20) //Only recalculate for passive skills. @@ -5462,7 +5462,7 @@ bool pc_skill_plagiarism_reset(map_session_data &sd, uint8 type) sd.status.skill[idx].id = 0; sd.status.skill[idx].lv = 0; sd.status.skill[idx].flag = SKILL_FLAG_PERMANENT; - clif_deleteskill(&sd, skill_id); + clif_deleteskill(sd, skill_id); if (type == 1) { sd.cloneskill_idx = 0; @@ -10053,7 +10053,7 @@ bool pc_revive_item(map_session_data *sd) { else pc_delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME); - clif_skill_nodamage(&sd->bl, &sd->bl, ALL_RESURRECTION, 4, 1); + clif_skill_nodamage(&sd->bl, sd->bl, ALL_RESURRECTION, 4); return true; } @@ -12262,18 +12262,18 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) { nullpo_retr(false,sd); if (n < 0 || n >= MAX_INVENTORY) { - clif_unequipitemack(sd,0,0,0); + clif_unequipitemack(*sd,0,0,false); return false; } if (!(pos = sd->inventory.u.items_inventory[n].equip)) { - clif_unequipitemack(sd,n,0,0); + clif_unequipitemack(*sd,n,0,false); return false; //Nothing to unequip } // status change that makes player cannot unequip equipment if (!(flag&2) && sd->sc.count &&( sd->sc.cant.unequip || (sd->sc.getSCE(SC_PYROCLASTIC) && sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon { - clif_unequipitemack(sd,n,0,0); + clif_unequipitemack(*sd,n,0,false); return false; } @@ -12312,7 +12312,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) { if(pos & EQP_SHOES) clif_changelook(&sd->bl,LOOK_SHOES,0); - clif_unequipitemack(sd,n,pos,1); + clif_unequipitemack(*sd,n,pos,true); pc_set_costume_view(sd); status_db.removeByStatusFlag(&sd->bl, { SCF_REMOVEONUNEQUIP }); @@ -12333,7 +12333,7 @@ bool pc_unequipitem(map_session_data *sd, int n, int flag) { if (idx >= 0) { sd->equip_index[EQI_AMMO] = -1; - clif_unequipitemack(sd, idx, sd->inventory.u.items_inventory[idx].equip, 1); + clif_unequipitemack(*sd, idx, sd->inventory.u.items_inventory[idx].equip, true); pc_unequipitem_sub(sd, idx, 0); } } diff --git a/src/map/pc.hpp b/src/map/pc.hpp index 4a8f7955ab..ab57cc4c00 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -706,7 +706,11 @@ public: int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united. int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign. - int trade_partner; + struct{ + uint32 id; + unsigned int lv; + }trade_partner; + struct s_deal { struct s_item { short index, amount; diff --git a/src/map/pet.cpp b/src/map/pet.cpp index e67a244fec..0c0ffaabf8 100644 --- a/src/map/pet.cpp +++ b/src/map/pet.cpp @@ -1192,7 +1192,7 @@ int pet_select_egg(map_session_data *sd,short egg_index) if(egg_index < 0 || egg_index >= MAX_INVENTORY) return 0; //Forged packet! - if(sd->trade_partner) //The player have trade in progress. + if(sd->state.trading) //The player have trade in progress. return 0; std::shared_ptr pet = pet_db_search(sd->inventory.u.items_inventory[egg_index].nameid, PET_EGG); @@ -2073,7 +2073,7 @@ TIMER_FUNC(pet_recovery_timer){ if(sd->sc.getSCE(pd->recovery->type)) { //Display a heal animation? //Detoxify is chosen for now. - clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1); + clif_skill_nodamage(&pd->bl,sd->bl,TF_DETOXIFY,1); status_change_end(&sd->bl, pd->recovery->type); clif_emotion(&pd->bl, ET_OK); } @@ -2116,7 +2116,7 @@ TIMER_FUNC(pet_heal_timer){ pet_stop_attack(pd); pet_stop_walking(pd,1); - clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->s_skill->lv,1); + clif_skill_nodamage(&pd->bl,sd->bl,AL_HEAL,pd->s_skill->lv); status_heal(&sd->bl, pd->s_skill->lv,0, 0); pd->s_skill->timer = add_timer(tick+pd->s_skill->delay*1000,pet_heal_timer,sd->bl.id,0); return 0; diff --git a/src/map/quest.cpp b/src/map/quest.cpp index a5644fd95f..be5ffdfa1e 100644 --- a/src/map/quest.cpp +++ b/src/map/quest.cpp @@ -242,7 +242,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) { } if (constant < SZ_SMALL || constant > SZ_ALL) { - this->invalidWarning(targetNode["size"], "Unsupported size %s, skipping.\n", size_.c_str()); + this->invalidWarning(targetNode["Size"], "Unsupported size %s, skipping.\n", size_.c_str()); return 0; } @@ -385,7 +385,7 @@ uint64 QuestDatabase::parseBodyNode(const ryml::NodeRef& node) { } if (!this->nodeExists(dropNode, "Rate")) { - this->invalidWarning(dropNode["Item"], "Drops has no Rate value specified, skipping.\n"); + this->invalidWarning(dropNode["Rate"], "Drops has no Rate value specified, skipping.\n"); continue; } diff --git a/src/map/script.cpp b/src/map/script.cpp index fc51fcf013..1c8c00ea42 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -15343,7 +15343,7 @@ static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16 clif_skill_poseffect(&bl, skill_id, skill_lv, x, y, gettick()); break; case CAST_NODAMAGE: - clif_skill_nodamage(&bl, &bl, skill_id, skill_lv, 1); + clif_skill_nodamage(&bl, bl, skill_id, skill_lv); break; case CAST_DAMAGE: clif_skill_damage(&bl, &bl, gettick(), status_get_amotion(&bl), status_get_dmotion(&bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id)); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index f064bce1fd..021f623722 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -1390,7 +1390,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint (skill=pc_checkskill(sd,RG_SNATCHER)) > 0 && (skill*15 + 55) + pc_checkskill(sd,TF_STEAL)*10 > rnd()%1000) { 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); else clif_skill_fail( *sd, RG_SNATCHER ); } @@ -1796,7 +1796,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint break; case GS_DISARM: skill_strip_equip(src, bl, skill_id, skill_lv); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case NPC_EVILLAND: sc_start(src,bl,SC_BLIND,5*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv)); @@ -1956,8 +1956,9 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint sc_start(src,bl, SC_SILENCE, 5 * skill_lv + (status_get_dex(src) + status_get_lv(src)) / 10, skill_lv, skill_get_time(skill_id, skill_lv)); break; case SR_EARTHSHAKER: + if (dstmd != nullptr && dstmd->guardian_data == nullptr) // Target is a mob (boss included) and not a guardian type. [Atemo] + sc_start(src, bl, SC_EARTHSHAKER, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); sc_start(src,bl,SC_STUN, 25 + 5 * skill_lv,skill_lv,skill_get_time(skill_id,skill_lv)); - sc_start(src, bl, SC_EARTHSHAKER, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); status_change_end(bl, SC_SV_ROOTTWIST); break; case SO_EARTHGRAVE: @@ -2646,7 +2647,7 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list * (rate=pc_checkskill(sd,HW_SOULDRAIN))>0 ){ //Soul Drain should only work on targetted spells [Skotlex] if (pc_issit(sd)) pc_setstand(sd, true); //Character stuck in attacking animation while 'sitting' fix. [Skotlex] - clif_skill_nodamage(src,bl,HW_SOULDRAIN,rate,1); + clif_skill_nodamage(src,*bl,HW_SOULDRAIN,rate); status_heal(src, 0, status_get_lv(bl)*(95+15*rate)/100, 2); } @@ -3394,7 +3395,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s case 1: //Copied by Plagiarism { if (tsd->cloneskill_idx > 0 && tsd->status.skill[tsd->cloneskill_idx].flag == SKILL_FLAG_PLAGIARIZED) { - clif_deleteskill(tsd,tsd->status.skill[tsd->cloneskill_idx].id, true); + clif_deleteskill(*tsd,tsd->status.skill[tsd->cloneskill_idx].id, true); tsd->status.skill[tsd->cloneskill_idx].id = 0; tsd->status.skill[tsd->cloneskill_idx].lv = 0; tsd->status.skill[tsd->cloneskill_idx].flag = SKILL_FLAG_PERMANENT; @@ -3414,7 +3415,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s //Skill level copied depends on Reproduce skill that used lv = (tsc) ? tsc->getSCE(SC__REPRODUCE)->val1 : 1; if( tsd->reproduceskill_idx > 0 && tsd->status.skill[tsd->reproduceskill_idx].flag == SKILL_FLAG_PLAGIARIZED ) { - clif_deleteskill(tsd,tsd->status.skill[tsd->reproduceskill_idx].id, true); + clif_deleteskill(*tsd,tsd->status.skill[tsd->reproduceskill_idx].id, true); tsd->status.skill[tsd->reproduceskill_idx].id = 0; tsd->status.skill[tsd->reproduceskill_idx].lv = 0; tsd->status.skill[tsd->reproduceskill_idx].flag = SKILL_FLAG_PERMANENT; @@ -3700,7 +3701,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * if(tsc && tsc->getSCE(SC_MAGICROD) && src == dsrc) { int sp = skill_get_sp(skill_id,skill_lv); #ifndef RENEWAL - clif_skill_nodamage(bl,bl,SA_MAGICROD,skill_lv,1); + clif_skill_nodamage(bl,*bl,SA_MAGICROD,skill_lv); #endif dmg.damage = dmg.damage2 = 0; dmg.dmg_lv = ATK_MISS; //This will prevent skill additional effect from taking effect. [Skotlex] @@ -3918,7 +3919,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * if (dmg.div_ < 2) type = DMG_SPLASH; if (!(flag&SD_ANIMATION)) - clif_skill_nodamage(dsrc, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(dsrc, *bl, skill_id, skill_lv); [[fallthrough]]; case WM_REVERBERATION: dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type); @@ -4118,7 +4119,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * if( ssc && ssc->getSCE(SC_POISONINGWEAPON) && rnd()%100 < 70 + 5*skill_lv ) { sc_start4(src, bl, (sc_type)ssc->getSCE(SC_POISONINGWEAPON)->val2, 100, ssc->getSCE(SC_POISONINGWEAPON)->val1, 0, 1, 0, skill_get_time2(GC_POISONINGWEAPON, 1)); status_change_end(src,SC_POISONINGWEAPON); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } } break; @@ -4580,7 +4581,7 @@ static TIMER_FUNC(skill_timerskill){ switch(skl->skill_id) { case KN_AUTOCOUNTER: - clif_skill_nodamage(src,target,skl->skill_id,skl->skill_lv,1); + clif_skill_nodamage(src,*target,skl->skill_id,skl->skill_lv); break; case RG_INTIMIDATE: if (unit_warp(src,-1,-1,-1,CLR_TELEPORT) == 0) { @@ -4681,7 +4682,7 @@ static TIMER_FUNC(skill_timerskill){ case WL_TETRAVORTEX_WATER: case WL_TETRAVORTEX_WIND: case WL_TETRAVORTEX_GROUND: - clif_skill_nodamage(src,target,skl->skill_id,skl->skill_lv,1); + clif_skill_nodamage(src,*target,skl->skill_id,skl->skill_lv); skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_LEVEL|SD_ANIMATION); if (skl->type >= 3) { // Final Hit if (!status_isdead(*target)) { // Final Status Effect @@ -5290,7 +5291,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case TR_RHYTHMSHOOTING: case HN_MEGA_SONIC_BLOW: case HN_SPIRAL_PIERCE_MAX: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); if (skill_id == DK_DRAGONIC_AURA) sc_start(src, src, SC_DRAGONIC_AURA, 100, skill_lv, skill_get_time(skill_id,skill_lv)); @@ -5301,7 +5302,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint sc_start(src, src, SC_E_SLASH_COUNT, 100, min( 5, 1 + sc->getSCE(SC_E_SLASH_COUNT)->val1 ), skill_get_time(skill_id, skill_lv)); else sc_start(src, src, SC_E_SLASH_COUNT, 100, 1, skill_get_time(skill_id, skill_lv)); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); break; @@ -5312,12 +5313,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint status_change_end(src, SC_CLOAKING); status_change_end(src, SC_CLOAKINGEXCEED); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); break; case WH_CRESCIVE_BOLT: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); if( sc && sc->getSCE(SC_CRESCIVEBOLT) ) sc_start(src, src, SC_CRESCIVEBOLT, 100, min( 3, 1 + sc->getSCE(SC_CRESCIVEBOLT)->val1 ), skill_get_time(skill_id, skill_lv)); @@ -5330,7 +5331,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (skill_check_unit_movepos(5, src, bl->x, bl->y, 0, 1)) skill_blown(src, src, 1, (map_calc_dir(bl, src->x, src->y) + 4) % 8, BLOWN_NONE); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); break; @@ -5367,7 +5368,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case TK_STORMKICK: // Taekwon kicks [Dralnu] - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_area_temp[1] = 0; map_foreachinshootrange(skill_attack_area, src, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, @@ -5437,7 +5438,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case AG_CRIMSON_ARROW: skill_area_temp[1] = bl->id; if (skill_id == AG_STORM_CANNON || skill_id == AG_CRIMSON_ARROW) - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (battle_config.skill_eightpath_algorithm) { //Use official AoE algorithm if (!(map_foreachindir(skill_attack_area, src->m, src->x, src->y, bl->x, bl->y, @@ -5575,7 +5576,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case SU_PICKYPECK: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); [[fallthrough]]; case SU_BITE: skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); @@ -5771,7 +5772,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint switch (skill_id) { case NPC_VAMPIRE_GIFT: if (heal > 0) { - clif_skill_nodamage(nullptr, src, AL_HEAL, heal, 1); + clif_skill_nodamage(nullptr, *src, AL_HEAL, heal); status_heal(src, heal, 0, 0); } break; @@ -5809,7 +5810,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case DK_HACKANDSLASHER: case MT_SPARK_BLASTER: case HN_JUPITEL_THUNDER_STORM: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; #ifdef RENEWAL case NJ_HUUMA: @@ -5835,7 +5836,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint // Jump to the target before attacking. if (skill_check_unit_movepos(5, src, bl->x, bl->y, 0, 1)) skill_blown(src, src, 1, (map_calc_dir(bl, src->x, src->y) + 4) % 8, BLOWN_NONE); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);// Trigger animation on servants. + clif_skill_nodamage(src, *bl, skill_id, skill_lv);// Trigger animation on servants. break; case SHC_SAVAGE_IMPACT: { if( sc && sc->getSCE( SC_CLOAKINGEXCEED ) ){ @@ -5851,7 +5852,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint // Move the player 1 cell near the target, between the target and the player if (skill_check_unit_movepos(5, src, bl->x + dirx[dir], bl->y + diry[dir], 0, 1)) clif_blown(src); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; } case SHC_FATAL_SHADOW_CROW: { @@ -5863,7 +5864,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint // Move the player 1 cell near the target, between the target and the player if (skill_check_unit_movepos(5, src, bl->x + dirx[dir], bl->y + diry[dir], 0, 1)) clif_blown(src); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);// Trigger animation + clif_skill_nodamage(src, *bl, skill_id, skill_lv);// Trigger animation break; } case AG_CRYSTAL_IMPACT_ATK: @@ -5883,14 +5884,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case EM_EL_STORM_WIND: case EM_EL_AVALANCHE: case EM_EL_DEADLY_POISON: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case ABC_CHAIN_REACTION_SHOT: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(ABC_CHAIN_REACTION_SHOT_ATK, skill_lv), BL_CHAR|BL_SKILL, src, ABC_CHAIN_REACTION_SHOT_ATK, skill_lv, tick + (200 + status_get_amotion(src)), flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); break; case IQ_THIRD_PUNISH: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (sd) { uint8 limit = 5; @@ -5901,28 +5902,28 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } break; case IQ_THIRD_FLAME_BOMB: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (sd && sd->spiritball / 5 > 1) skill_area_temp[0] = sd->spiritball / 5 - 1; break; case IQ_THIRD_CONSECRATION: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_heal(src, status_get_max_hp(src) * skill_lv / 100, status_get_max_sp(src) * skill_lv / 100, 0); break; case IG_OVERSLASH: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count); break; case WH_GALESTORM:// Give AP if 3 or more targets are hit. if (sd && map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count) >= 3) status_heal(src, 0, 0, 10, 0); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case BO_ACIDIFIED_ZONE_WATER: case BO_ACIDIFIED_ZONE_GROUND: case BO_ACIDIFIED_ZONE_WIND: case BO_ACIDIFIED_ZONE_FIRE: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (bl->type == BL_PC)// Place single cell AoE if hitting a player. skill_castend_pos2(src, bl->x, bl->y, skill_id, skill_lv, tick, 0); break; @@ -5931,14 +5932,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if( skill_check_unit_movepos( 5, src, bl->x, bl->y, 0, 1 ) ){ skill_blown( src, src, 1, direction_opposite( static_cast( map_calc_dir( bl, src->x, src->y ) ) ), BLOWN_NONE); } - clif_skill_nodamage( src, bl, skill_id, skill_lv, 1 ); // Trigger animation + clif_skill_nodamage( src, *bl, skill_id, skill_lv); // Trigger animation clif_blown( src ); // TODO: does this buff start before or after dealing damage? [Muh] sc_start( src, src, SC_RUSH_QUAKE2, 100, skill_lv, skill_get_time2( skill_id, skill_lv ) ); break; case IG_SHIELD_SHOOTING: case IG_GRAND_JUDGEMENT: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); sc_start(src, src, skill_get_sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv)); break; } @@ -5972,7 +5973,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (sd && sd->weapontype1 == W_GRENADE) splash += 2; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); if (sc && sc->getSCE(SC_INTENSIVE_AIM_COUNT)) status_change_end(src, SC_INTENSIVE_AIM_COUNT); @@ -5981,7 +5982,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint //Place units around target case NJ_BAKUENRYU: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_unitsetting(src, skill_id, skill_lv, bl->x, bl->y, 0); break; @@ -6132,7 +6133,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } break; case CH_PALMSTRIKE: // Palm Strike takes effect 1sec after casting. [Skotlex] - // clif_skill_nodamage(src,bl,skill_id,skill_lv,0); //Can't make this one display the correct attack animation delay :/ + // clif_skill_nodamage(src,*bl,skill_id,skill_lv,false); //Can't make this one display the correct attack animation delay :/ clif_damage(*src,*bl,tick,status_get_amotion(src),0,-1,1,DMG_ENDURE,0,false); //Display an absorbed damage attack. skill_addtimerskill(src, tick + (1000+status_get_amotion(src)), bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag); break; @@ -6181,7 +6182,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case IG_JUDGEMENT_CROSS: case TR_SOUNDBLEND: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_attack(BF_MAGIC, src, src, bl, skill_id, skill_lv, tick, flag); break; @@ -6307,7 +6308,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case RK_DRAGONBREATH: case NPC_DRAGONBREATH: if( tsc && tsc->getSCE(SC_HIDING) ) - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); else { skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); } @@ -6325,12 +6326,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint // Celest case PF_SOULBURN: if (rnd()%100 < (skill_lv < 5 ? 30 + skill_lv * 10 : 70)) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (skill_lv == 5) skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag); status_percent_damage(src, bl, 0, 100, false); } else { - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); if (skill_lv == 5) skill_attack(BF_MAGIC,src,src,src,skill_id,skill_lv,tick,flag); status_percent_damage(src, src, 0, 100, false); @@ -6343,7 +6344,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint int heal = (int)skill_attack( (skill_id == NPC_BLOODDRAIN) ? BF_WEAPON : BF_MAGIC, src, src, bl, skill_id, skill_lv, tick, flag); if (heal > 0){ - clif_skill_nodamage(nullptr, src, AL_HEAL, heal, 1); + clif_skill_nodamage(nullptr, *src, AL_HEAL, heal); status_heal(src, heal, 0, 0); } } @@ -6372,7 +6373,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case RK_PHANTOMTHRUST: case NPC_PHANTOMTHRUST: unit_setdir(src,map_calc_dir(src, bl->x, bl->y)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_blown(src,bl,distance_bl(src,bl)-1,unit_getdir(src),BLOWN_NONE); if( battle_check_target(src,bl,BCT_ENEMY) > 0 ) @@ -6383,7 +6384,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if( flag&1 ) skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); else { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinallrange(skill_area_sub, bl,skill_get_splash(skill_id, skill_lv),BL_CHAR,src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1,skill_castend_nodamage_id); } break; @@ -6461,7 +6462,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if( heal && rnd()%100 < rate ) { status_heal(src, heal, 0, 0); - clif_skill_nodamage(nullptr, src, AL_HEAL, heal, 1); + clif_skill_nodamage(nullptr, *src, AL_HEAL, heal); } } break; @@ -6606,7 +6607,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_addtimerskill(src, tick + (t_tick)status_get_adelay(src) * abs(i - SC_SPHERE_1), bl->id, 0, 0, skele, sc->getSCE(static_cast(i))->val2, BF_MAGIC, flag | SD_LEVEL); status_change_end(src, static_cast(i)); // Eliminate ball } - clif_skill_nodamage(src, bl, skill_id, 0, 1); + clif_skill_nodamage(src, *bl, skill_id, 0); } } break; @@ -6623,7 +6624,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_attack(BF_MAGIC, src, src, bl, skill_id, skill_lv, tick, flag); skill_addtimerskill(src, tick + 300, bl->id, 0, 0, skill_id, skill_lv, BF_MAGIC, flag | 2); } else { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); } break; @@ -6775,7 +6776,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (flag & 1) skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); else { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); battle_consume_ammo(sd, skill_id, skill_lv); // Consume here since Magic/Misc attacks reset arrow_atk } @@ -6822,7 +6823,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_attack(skill_get_type(skill_id+1),src,src,bl,skill_id+1,skill_lv,tick,flag); else { int i = skill_get_splash(skill_id,skill_lv); - clif_skill_nodamage(src,battle_get_master(src),skill_id,skill_lv,1); + clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); if( rnd()%100 < 30 ) map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); @@ -6832,7 +6833,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case EL_ROCK_CRUSHER: - clif_skill_nodamage(src,battle_get_master(src),skill_id,skill_lv,1); + clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); if( rnd()%100 < 50 ) skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag); @@ -6845,7 +6846,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); else { int i = skill_get_splash(skill_id,skill_lv); - clif_skill_nodamage(src,battle_get_master(src),skill_id,skill_lv,1); + clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); if( rnd()%100 < 30 ) map_foreachinrange(skill_area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); @@ -6858,7 +6859,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case EL_ICE_NEEDLE: case EL_WIND_SLASH: case EL_STONE_HAMMER: - clif_skill_nodamage(src,battle_get_master(src),skill_id,skill_lv,1); + clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); break; @@ -6869,7 +6870,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint status_change *tsc_ele = status_get_sc(&ele->bl); sc_type type = SC_TIDAL_WEAPON_OPTION, type2 = SC_TIDAL_WEAPON; - clif_skill_nodamage(src,battle_get_master(src),skill_id,skill_lv,1); + clif_skill_nodamage(src,*battle_get_master(src),skill_id,skill_lv); clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); if( (tsc_ele && tsc_ele->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) { status_change_end(battle_get_master(src),type); @@ -6881,7 +6882,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint sc_start(src,src,type2,100,skill_lv,skill_get_time(skill_id,skill_lv)); sc_start(src,battle_get_master(src),type,100,ele->bl.id,skill_get_time(skill_id,skill_lv)); } - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); } break; @@ -6930,7 +6931,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint type = SC_EQC; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start4(src,bl,type,100,skill_lv,src->id,0,0,duration)); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start4(src,bl,type,100,skill_lv,src->id,0,0,duration)); skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); } break; @@ -6984,7 +6985,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (skill_id == RL_HAMMER_OF_GOD) clif_skill_poseffect(src, skill_id, 1, bl->x, bl->y, gettick()); else - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); } @@ -7097,7 +7098,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, skill_area_temp[0] & 0xFFF); } else { int splash = skill_get_splash(skill_id, skill_lv); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count); map_foreachinrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); sc_start(src, src, SC_HNNOWEAPON, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); @@ -7108,7 +7109,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (flag & 1) { skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); } else { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); sc_start(src, src, SC_HNNOWEAPON, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); } @@ -7125,7 +7126,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (flag & 1) { skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); } else { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); } break; @@ -7245,7 +7246,7 @@ static int skill_castend_song(struct block_list* src, uint16 skill_id, uint16 sk break; } - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); sd->skill_id_dance = skill_id; sd->skill_lv_dance = skill_lv; @@ -7386,7 +7387,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } if (skill_id == AL_HEAL) status_change_end(bl, SC_BITESCAR); - clif_skill_nodamage (src, bl, skill_id, heal, 1); + clif_skill_nodamage(src, *bl, skill_id, heal); if( tsc && tsc->getSCE(SC_AKAITSUKI) && heal && skill_id != HLIF_HEAL ) heal = ~heal + 1; t_exp heal_get_jobexp = status_heal(bl,heal,0,0); @@ -7412,8 +7413,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (!status_isimmune(bl)) heal_amount = tstatus->max_hp; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - clif_skill_nodamage(nullptr, bl, AL_HEAL, heal_amount, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); + clif_skill_nodamage(nullptr, *bl, AL_HEAL, heal_amount); status_heal(bl, heal_amount, 0, 0); } break; @@ -7463,7 +7464,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { int per = 0, sper = 0; if (tsc && tsc->getSCE(SC_HELLPOWER)) { - clif_skill_nodamage(src, bl, ALL_RESURRECTION, skill_lv, 1); + clif_skill_nodamage(src, *bl, ALL_RESURRECTION, skill_lv); break; } @@ -7480,7 +7481,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui per = sper = 100; if (status_revive(bl, per, sper)) { - clif_skill_nodamage(src,bl,ALL_RESURRECTION,skill_lv,1); //Both Redemptio and Res show this skill-animation. + clif_skill_nodamage(src,*bl,ALL_RESURRECTION,skill_lv); //Both Redemptio and Res show this skill-animation. if(sd && dstsd && battle_config.resurrection_exp > 0) { t_exp exp = 0,jexp = 0; @@ -7502,7 +7503,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AL_DECAGI: case MER_DECAGI: - clif_skill_nodamage (src, bl, skill_id, skill_lv, + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src,bl, type, (50 + skill_lv * 3 + (status_get_lv(src) + sstatus->int_)/5), skill_lv, skill_get_time(skill_id,skill_lv))); break; @@ -7512,7 +7513,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else { map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -7521,7 +7522,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src, bl, type, 30 + 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); else { map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -7531,12 +7532,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl, type); else skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, 100, flag); - clif_skill_nodamage (src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case SA_ABRACADABRA: if (abra_db.empty()) { - clif_skill_nodamage (src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; } else { @@ -7554,7 +7555,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } } while (checked++ < checked_max); - clif_skill_nodamage (src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if( sd ) {// player-casted @@ -7596,11 +7597,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case SA_COMA: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time2(skill_id,skill_lv))); break; case SA_FULLRECOVERY: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (status_isimmune(bl)) break; status_percent_heal(bl, 100, 100); @@ -7611,7 +7612,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( status_isimmune(bl) ) break; heal = status_percent_heal(bl, 100, 0); - clif_skill_nodamage(nullptr, bl, AL_HEAL, heal, 1); + clif_skill_nodamage(nullptr, *bl, AL_HEAL, heal); if( dstmd ) { // Reset Damage Logs memset(dstmd->dmglog, 0, sizeof(dstmd->dmglog)); @@ -7620,24 +7621,24 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; case SA_SUMMONMONSTER: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (sd) mob_once_spawn(sd, src->m, src->x, src->y,"--ja--", -1, 1, "", SZ_SMALL, AI_NONE); break; case SA_LEVELUP: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd, nullptr, pc_nextbaseexp(sd) * 10 / 100, 0, 0); break; case SA_INSTANTDEATH: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); status_kill(src); break; case SA_QUESTION: clif_emotion(src,ET_QUESTION); [[fallthrough]]; case SA_GRAVITY: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case SA_CLASSCHANGE: case SA_MONOCELL: @@ -7650,7 +7651,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } class_ = (skill_id == SA_MONOCELL ? MOBID_PORING : mob_get_random_id(MOBG_CLASSCHANGE, RMF_DB_RATE, 0)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); mob_class_change(dstmd,class_); if( tsc && status_has_mode(&dstmd->status,MD_STATUSIMMUNE) ) { const enum sc_type scs[] = { SC_QUAGMIRE, SC_PROVOKE, SC_ROKISWEIL, SC_GRAVITATION, SC_SUITON, SC_STRIPWEAPON, SC_STRIPSHIELD, SC_STRIPARMOR, SC_STRIPHELM, SC_BLADESTOP }; @@ -7666,20 +7667,20 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_fail( *sd, skill_id ); break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); status_kill(bl); break; case SA_REVERSEORCISH: case ALL_REVERSEORCISH: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id, skill_lv))); break; case SA_FORTUNE: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if(sd) pc_getzeny(sd,status_get_lv(bl)*100,LOG_TYPE_STEAL); break; case SA_TAMINGMONSTER: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (sd && dstmd && pet_db.find(dstmd->mob_id)) { pet_catch_process1(sd, dstmd->mob_id); } @@ -7693,7 +7694,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui return 1; } } - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; @@ -7712,7 +7713,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { sc_start(src,src,SC_MARIONETTE,100,bl->id,skill_get_time(skill_id,skill_lv)); sc_start(src,bl,SC_MARIONETTE2,100,src->id,skill_get_time(skill_id,skill_lv)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } else if( sc->getSCE(SC_MARIONETTE ) && sc->getSCE(SC_MARIONETTE )->val1 == bl->id && @@ -7734,7 +7735,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case RG_CLOSECONFINE: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start4(src,bl,type,100,skill_lv,src->id,0,0,skill_get_time(skill_id,skill_lv))); break; case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris] @@ -7744,14 +7745,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (dstsd && dstsd->status.weapon == W_FIST) { if (sd) clif_skill_fail( *sd, skill_id ); - clif_skill_nodamage(src,bl,skill_id,skill_lv,0); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,false); break; } #ifdef RENEWAL - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); #else // 100% success rate at lv4 & 5, but lasts longer at lv5 - if(!clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,type,(60+skill_lv*10),skill_lv, skill_get_time(skill_id,skill_lv)))) { + if(!clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,(60+skill_lv*10),skill_lv, skill_get_time(skill_id,skill_lv)))) { if (dstsd){ short index = dstsd->equip_index[EQI_HAND_R]; if (index != -1 && dstsd->inventory_data[index] && dstsd->inventory_data[index]->type == IT_WEAPON) @@ -7765,15 +7766,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case PR_ASPERSIO: if (sd && dstmd) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,0); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,false); break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case ITEM_ENCHANTARMS: - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_get_ele(skill_id, skill_lv), skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_get_ele(skill_id, skill_lv), skill_get_time(skill_id, skill_lv))); break; case TK_SEVENWIND: @@ -7786,7 +7787,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case ELE_DARK : type = SC_SHADOWWEAPON; break; case ELE_HOLY : type = SC_ASPERSIO; break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); sc_start(src,bl,SC_SEVENWIND,100,skill_lv,skill_get_time(skill_id,skill_lv)); @@ -7800,7 +7801,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui return 0; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); clif_blown(bl); @@ -7828,7 +7829,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case 9: type = SC_IMMUNE_PROPERTY_TELEKINESIS; break; case 10: type = SC_IMMUNE_PROPERTY_UNDEAD; break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case PR_KYRIE: @@ -7837,7 +7838,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SU_GROOMING: case SU_CHATTERING: case ALL_RAY_OF_PROTECTION: - clif_skill_nodamage(bl,bl,skill_id,skill_lv, + clif_skill_nodamage(bl,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; //Passive Magnum, should had been casted on yourself. @@ -7846,7 +7847,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui skill_area_temp[1] = 0; map_foreachinshootrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_SKILL|BL_CHAR, src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1, skill_castend_damage_id); - clif_skill_nodamage (src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src, *src,skill_id,skill_lv); // Initiate 20% of your damage becomes fire element. #ifdef RENEWAL sc_start4(src,src,SC_SUB_WEAPONPROPERTY,100,ELE_FIRE,20,skill_id,0,skill_get_time2(skill_id, skill_lv)); @@ -7870,13 +7871,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case PR_BENEDICTIO: if (!battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race != RC_DEMON) - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); break; case AL_INCAGI: case AL_BLESSING: case MER_INCAGI: case MER_BLESSING: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (dstsd != nullptr && tsc && tsc->getSCE(SC_CHANGEUNDEAD)) { if (tstatus->hp > 1) skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag); @@ -8018,25 +8019,25 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NPC_RELIEVE_OFF: case HN_BREAKINGLIMIT: case HN_RULEBREAK: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case NPC_GRADUAL_GRAVITY: case NPC_DEADLYCURSE: status_change_start(src, bl, type, 10000, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case NPC_ALL_STAT_DOWN: status_change_start(src, bl, type, 10000, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); break; // EDP also give +25% WATK poison pseudo element to user. case ASC_EDP: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); #ifdef RENEWAL sc_start4(src, src, SC_SUB_WEAPONPROPERTY, 100, ELE_POISON, 25, skill_id, 0, skill_get_time(skill_id, skill_lv)); @@ -8053,18 +8054,18 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else type = SC_SHIELDSPELL_ATK; - clif_skill_nodamage(src, bl, skill_id, skill_lv, + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); break; case DK_SERVANTWEAPON: case ABC_FROM_THE_ABYSS: - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))); break; case TR_SOUNDBLEND: skill_castend_damage_id(src, bl, skill_id, skill_lv, tick, 0); - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, src->id, skill_get_time(skill_id, skill_lv))); break; case AG_VIOLENT_QUAKE: @@ -8090,7 +8091,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } skill_area_temp[1] = 0; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (skill_id == AG_DESTRUCTIVE_HURRICANE && climax_lv == 4) // Buff for caster instead of damage AoE. sc_start(src, bl, type, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); @@ -8098,7 +8099,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_foreachinrange(skill_area_sub, bl, splash_size, BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ALLY|SD_SPLASH|1, skill_castend_nodamage_id); else { if (skill_id == AG_DESTRUCTIVE_HURRICANE && climax_lv == 1) // Display extra animation for the additional hit cast. - clif_skill_nodamage(src, bl, AG_DESTRUCTIVE_HURRICANE_CLIMAX, skill_lv, 1); + clif_skill_nodamage(src, *bl, AG_DESTRUCTIVE_HURRICANE_CLIMAX, skill_lv); map_foreachinrange(skill_area_sub, bl, splash_size, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); } @@ -8111,15 +8112,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sd == nullptr || sd->status.party_id == 0 || (flag & 2)) { int heal_amount = skill_calc_heal(src, bl, skill_id, skill_lv, 1); - clif_skill_nodamage( nullptr, bl, AL_HEAL, heal_amount, 1 ); + clif_skill_nodamage(nullptr, *bl, AL_HEAL, heal_amount); status_heal(bl, heal_amount, 0, 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 | 3, skill_castend_nodamage_id); } else { if (skill_id == CD_MEDIALE_VOTUM) - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); else { // Dilectio Heal - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); // Placed here to display animation on target only. + clif_skill_nodamage(src, *bl, skill_id, skill_lv); // Placed here to display animation on target only. skill_castend_nodamage_id(bl, bl, skill_id, skill_lv, tick, 1); } } @@ -8130,13 +8131,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui int hp_amount = tstatus->max_hp * (20 * skill_lv) / 100; int sp_amount = tstatus->max_sp * (20 * skill_lv) / 100; - clif_skill_nodamage( nullptr, bl, AL_HEAL, hp_amount, 1 ); + clif_skill_nodamage(nullptr, *bl, AL_HEAL, hp_amount); status_heal(bl, hp_amount, 0, 0); - clif_skill_nodamage( nullptr, bl, MG_SRECOVERY, sp_amount, 1 ); + clif_skill_nodamage(nullptr, *bl, MG_SRECOVERY, sp_amount); status_heal(bl, 0, sp_amount, 0); - clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } 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; @@ -8147,14 +8148,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_freeblock_unlock(); // Don't consume item requirements return 0; } - clif_skill_nodamage( src, bl, skill_id, skill_lv, sc_start( src, bl, type, 100, skill_lv, skill_get_time( skill_id, skill_lv ) ) ); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start( src, bl, type, 100, skill_lv, skill_get_time( skill_id, skill_lv ) ) ); break; case EM_ACTIVITY_BURN: if (bl->type == BL_PC && rnd() % 100 < 20 + 10 * skill_lv) { uint8 ap_burn[5] = { 20, 30, 50, 60, 70 }; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_fix_apdamage(src, bl, ap_burn[skill_lv - 1], 0, skill_id); } else if (sd) clif_skill_fail( *sd, skill_id, USESKILL_FAIL ); @@ -8162,7 +8163,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case EM_INCREASING_ACTIVITY: if (bl->type == BL_PC) { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_heal(bl, 0, 0, 10 * skill_lv, 0); } else if (sd) clif_skill_fail( *sd, skill_id, USESKILL_FAIL ); @@ -8178,12 +8179,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui fall_damage = max(1, fall_damage); - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, fall_damage, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, fall_damage, skill_get_time(skill_id, skill_lv))); } break; case NPC_HALLUCINATION: case NPC_HELLPOWER: - clif_skill_nodamage(src, bl, skill_id, skill_lv, + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, skill_lv*20, skill_lv, skill_get_time2(skill_id, skill_lv))); break; @@ -8203,13 +8204,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui bonus = (20 * skill_lv) * dstsd->inventory_data[index]->weapon_level; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src,bl, type, 100, skill_lv, bonus, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start2(src,bl, type, 100, skill_lv, bonus, skill_get_time(skill_id, skill_lv))); } else if (sd) clif_skill_fail( *sd, skill_id, USESKILL_FAIL_TOTARGET ); break; case NPC_STOP: - if( clif_skill_nodamage(src,bl,skill_id,skill_lv, + if( clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start2(src,bl,type,100,skill_lv,src->id,skill_get_time(skill_id,skill_lv)) ) ) sc_start2(src,src,type,100,skill_lv,bl->id,skill_get_time(skill_id,skill_lv)); break; @@ -8217,7 +8218,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( sd && dstmd ) clif_skill_fail( *sd, skill_id ); else - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case MG_SIGHT: @@ -8227,7 +8228,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NPC_WIDESIGHT: case NPC_STONESKIN: case NPC_ANTIMAGIC: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start2(src,bl,type,100,skill_lv,skill_id,skill_get_time(skill_id,skill_lv))); break; case HLIF_AVOID: @@ -8235,11 +8236,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // Master sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); // Homunculus - clif_skill_nodamage(src, src, skill_id, skill_lv, sc_start(src, src, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *src, skill_id, skill_lv, sc_start(src, src, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); break; case NJ_BUNSINJYUTSU: status_change_end(bl, SC_BUNSINJYUTSU); // on official recasting cancels existing mirror image [helvetica] - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); status_change_end(bl, SC_NEN); break; @@ -8253,20 +8254,20 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui skill_get_splash(skill_id, skill_lv), BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; */ case SM_ENDURE: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case AS_ENCHANTPOISON: if( sc_start( src, bl, type, 100, skill_lv, skill_get_time( skill_id, skill_lv ) ) ){ - clif_skill_nodamage( src, bl, skill_id, skill_lv, 1 ); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); }else{ - clif_skill_nodamage( src, bl, skill_id, skill_lv, 0 ); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, false ); if( sd != nullptr ){ clif_skill_fail( *sd, skill_id ); @@ -8275,17 +8276,17 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case LK_TENSIONRELAX: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start4(src,bl,type,100,skill_lv,0,0,skill_get_time2(skill_id,skill_lv), skill_get_time(skill_id,skill_lv))); break; case MC_CHANGECART: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case MC_CARTDECORATE: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if( sd ) { clif_SelectCart(sd); } @@ -8309,14 +8310,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sd->mission_count = 0; pc_setglobalreg(sd, add_str(TKMISSIONID_VAR), id); clif_mission_info(sd, id, 0); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case AC_CONCENTRATION: { int splash = skill_get_splash(skill_id, skill_lv); - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); skill_reveal_trap_inarea(src, splash, src->x, src->y); map_foreachinallrange( status_change_timer_sub, src, @@ -8339,7 +8340,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_freeblock_unlock(); return 0; } - clif_skill_nodamage(src, bl, skill_id == SM_SELFPROVOKE ? SM_PROVOKE : skill_id, skill_lv, i); + clif_skill_nodamage(src, *bl, skill_id == SM_SELFPROVOKE ? SM_PROVOKE : skill_id, skill_lv, i != 0); unit_skillcastcancel(bl, 2); if( dstmd ) @@ -8398,7 +8399,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else mer->devotion_flag = 1; // Mercenary Devoting Owner - clif_skill_nodamage(src, bl, skill_id, skill_lv, + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start4(src, bl, type, 10000, src->id, i, skill_get_range2(src, skill_id, skill_lv, true), 0, skill_get_time2(skill_id, skill_lv))); clif_devotion(src, nullptr); } @@ -8437,7 +8438,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sd->united_soul[i] = bl->id; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, skill_lv, src->id, i, 0, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, skill_lv, src->id, i, 0, skill_get_time(skill_id, skill_lv))); } 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); } @@ -8478,10 +8479,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sd->servant_sign[i] = bl->id; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); sc_start4(src, bl, type, 100, src->id, i, skill_lv, 0, skill_get_time(skill_id, skill_lv)); } else if (md) // Monster's cant track with this skill. Just give the status. - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, 0, 0, skill_lv, 0, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, 0, 0, skill_lv, 0, skill_get_time(skill_id, skill_lv))); break; case MO_CALLSPIRITS: @@ -8489,7 +8490,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui int limit = skill_lv; if( sd->sc.getSCE(SC_RAISINGDRAGON) ) limit += sd->sc.getSCE(SC_RAISINGDRAGON)->val1; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); pc_addspiritball(sd,skill_get_time(skill_id,skill_lv),limit); } break; @@ -8499,7 +8500,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui int limit = 5; if( sd->sc.getSCE(SC_RAISINGDRAGON) ) limit += sd->sc.getSCE(SC_RAISINGDRAGON)->val1; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); for (i = 0; i < limit; i++) pc_addspiritball(sd,skill_get_time(skill_id,skill_lv),limit); } @@ -8550,27 +8551,27 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } if (i) status_heal(src, 0, i, 3); - clif_skill_nodamage(src,bl,skill_id,skill_lv,i?1:0); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,i != 0); break; case AC_MAKINGARROW: if( sd != nullptr ){ clif_arrow_create_list( *sd ); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case AM_PHARMACY: if(sd) { clif_skill_produce_mix_list( *sd, skill_id, 22 ); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case SA_CREATECON: if( sd != nullptr ){ clif_elementalconverter_list( *sd ); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -8580,7 +8581,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case RG_RAID: skill_area_temp[1] = 0; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1, @@ -8630,7 +8631,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (skill_id == SJ_NEWMOONKICK) { if (tsce) { status_change_end(bl, type); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; } else sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); @@ -8651,7 +8652,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } skill_area_temp[1] = 0; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == LG_CANNONSPEAR || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) ) @@ -8666,7 +8667,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // Note: doesn't force player to stand before attacking map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR | BL_SKILL, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_LEVEL | SD_SPLASH, skill_castend_damage_id); } else { - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } break; @@ -8692,7 +8693,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } } - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } break; @@ -8727,8 +8728,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } skill_area_temp[1] = 0; - clif_skill_nodamage(src, bl, buster_element, skill_lv, 1);// Animation for the triggered blaster element. - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);// Triggered after blaster animation to make correct skill name scream appear. + clif_skill_nodamage(src, *bl, buster_element, skill_lv);// Animation for the triggered blaster element. + clif_skill_nodamage(src, *bl, skill_id, skill_lv);// Triggered after blaster animation to make correct skill name scream appear. map_foreachinrange(skill_area_sub, bl, 6, BL_CHAR | BL_SKILL, src, buster_element, skill_lv, tick, flag | BCT_ENEMY | SD_LEVEL | SD_SPLASH | 1, skill_castend_damage_id); } break; @@ -8737,7 +8738,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case RK_IGNITIONBREAK: skill_area_temp[1] = 0; #if PACKETVER >= 20180207 - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); #else clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); #endif @@ -8747,7 +8748,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SR_TIGERCANNON: case SR_WINDMILL: case GN_CART_TORNADO: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); [[fallthrough]]; case SR_EARTHSHAKER: case NC_INFRAREDSCAN: @@ -8797,7 +8798,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case WZ_SIGHTRASHER: //Passive side of the attack. status_change_end(src, SC_SIGHT); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinshootrange(skill_area_sub,src, skill_get_splash(skill_id, skill_lv),BL_CHAR|BL_SKILL, src,skill_id,skill_lv,tick, flag|BCT_ENEMY|SD_ANIMATION|1, @@ -8805,7 +8806,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case WZ_FROSTNOVA: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_area_temp[1] = 0; map_foreachinshootrange(skill_attack_area, src, skill_get_splash(skill_id, skill_lv), splash_target(src), @@ -8839,7 +8840,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // Animations don't play when outside visible range if (check_distance_bl(src, bl, AREA_SIZE)) - clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); } @@ -8858,7 +8859,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case IG_GUARDIAN_SHIELD: case IG_ULTIMATE_SACRIFICE:// Is the animation on this skill correct? Check if its on caster only or all affected. [Rytech] if( sd == nullptr || sd->status.party_id == 0 || (flag & 1) ) - clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); else if (sd) { if (skill_id == IG_ULTIMATE_SACRIFICE) @@ -8870,11 +8871,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MER_MAGNIFICAT: if( mer != nullptr ) { - clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); if( mer->master && mer->master->status.party_id != 0 && !(flag&1) ) party_foreachsamemap(skill_area_sub, mer->master, skill_get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill_castend_nodamage_id); else if( mer->master && !(flag&1) ) - clif_skill_nodamage(src, &mer->master->bl, skill_id, skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src, mer->master->bl, skill_id, skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); } break; @@ -8885,7 +8886,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sd == nullptr || sd->status.party_id == 0 || (flag & 1)) { int weapontype = skill_get_weapontype(skill_id); if (!weapontype || !dstsd || pc_check_weapontype(dstsd, weapontype)) { - clif_skill_nodamage(bl, bl, skill_id, skill_lv, + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, (src == bl) ? 1 : 0, skill_get_time(skill_id, skill_lv))); } } else if (sd) { @@ -8919,15 +8920,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case IG_ATTACK_STANCE: if( tsce ) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,status_change_end(bl, type)); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,status_change_end(bl, type)); map_freeblock_unlock(); return 0; } if( skill_id == SP_SOULCOLLECT ){ - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, pc_checkskill(sd, SP_SOULENERGY), skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, pc_checkskill(sd, SP_SOULENERGY), skill_get_time(skill_id, skill_lv))); }else{ - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } break; case SL_KAITE: @@ -8955,10 +8956,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_fail( *sd, skill_id, USESKILL_FAIL ); break; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_heal(bl, 0, tstatus->max_sp * (10 + 2 * skill_lv) / 100, 2); } else - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); break; case SM_AUTOBERSERK: case MER_AUTOBERSERK: @@ -8966,27 +8967,27 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui i = status_change_end(bl, type); else i = sc_start(src,bl,type,100,skill_lv,60000); - clif_skill_nodamage(src,bl,skill_id,skill_lv,i); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,i); break; case TF_HIDING: case ST_CHASEWALK: case KO_YAMIKUMO: if (tsce) { - clif_skill_nodamage(src,bl,skill_id,-1,status_change_end(bl, type)); //Hide skill-scream animation. + clif_skill_nodamage(src,*bl,skill_id,-1,status_change_end(bl, type)); //Hide skill-scream animation. map_freeblock_unlock(); return 0; } - clif_skill_nodamage(src,bl,skill_id,-1,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,-1,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case TK_RUN: if (tsce) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,status_change_end(bl, type)); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,status_change_end(bl, type)); map_freeblock_unlock(); return 0; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start4(src,bl,type,100,skill_lv,unit_getdir(bl),0,0,0)); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start4(src,bl,type,100,skill_lv,unit_getdir(bl),0,0,0)); if (sd) // If the client receives a skill-use packet inmediately before a walkok packet, it will discard the walk packet! [Skotlex] clif_walkok(*sd); // So aegis has to resend the walk ok. break; @@ -9000,7 +9001,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (tsce) { i = status_change_end(bl, type); if( i ) - clif_skill_nodamage(src,bl,skill_id,( skill_id == LG_FORCEOFVANGUARD || skill_id == RA_CAMOUFLAGE ) ? skill_lv : -1,i); + clif_skill_nodamage(src,*bl,skill_id,( skill_id == LG_FORCEOFVANGUARD || skill_id == RA_CAMOUFLAGE ) ? skill_lv : -1,i); else if( sd ) clif_skill_fail( *sd, skill_id ); map_freeblock_unlock(); @@ -9008,25 +9009,25 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } i = sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); if( i ) - clif_skill_nodamage(src,bl,skill_id,( skill_id == LG_FORCEOFVANGUARD || skill_id == RA_CAMOUFLAGE ) ? skill_lv : -1,i); + clif_skill_nodamage(src,*bl,skill_id,( skill_id == LG_FORCEOFVANGUARD || skill_id == RA_CAMOUFLAGE ) ? skill_lv : -1,i); else if( sd ) clif_skill_fail( *sd, skill_id, USESKILL_FAIL_LEVEL ); break; case CG_SPECIALSINGER: if (tsc && tsc->getSCE(SC_ENSEMBLEFATIGUE)) { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_change_end(bl, SC_ENSEMBLEFATIGUE); } break; case BD_ADAPTATION: #ifdef RENEWAL - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); #else if(tsc && tsc->getSCE(SC_DANCING)){ - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); status_change_end(bl, SC_DANCING); } #endif @@ -9034,7 +9035,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case BA_FROSTJOKER: case DC_SCREAM: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_addtimerskill(src,tick+3000,bl->id,src->x,src->y,skill_id,skill_lv,0,flag); if (md) { @@ -9047,7 +9048,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case BA_PANGVOICE: - clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,SC_CONFUSION,70,7,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,SC_CONFUSION,70,7,skill_get_time(skill_id,skill_lv))); #ifdef RENEWAL sc_start(src, bl, SC_BLEEDING, 30, skill_lv, skill_get_time2(skill_id, skill_lv)); // TODO: Confirm success rate #endif @@ -9055,7 +9056,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case DC_WINKCHARM: if( dstsd ) { - clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,SC_CONFUSION,10,7,skill_get_time2(skill_id,skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,SC_CONFUSION,10,7,skill_get_time2(skill_id,skill_lv))); #ifdef RENEWAL sc_start(src, bl, SC_HALLUCINATION, 30, skill_lv, skill_get_time(skill_id, skill_lv)); // TODO: Confirm success rate and duration #endif @@ -9065,10 +9066,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( status_get_lv(src) > status_get_lv(bl) && (tstatus->race == RC_DEMON || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_PLAYER_HUMAN || tstatus->race == RC_PLAYER_DORAM || tstatus->race == RC_ANGEL) && !status_has_mode(tstatus,MD_STATUSIMMUNE) ) - clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start2(src,bl,type,(status_get_lv(src) - status_get_lv(bl)) + 40, skill_lv, src->id, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start2(src,bl,type,(status_get_lv(src) - status_get_lv(bl)) + 40, skill_lv, src->id, skill_get_time(skill_id, skill_lv))); else { - clif_skill_nodamage(src,bl,skill_id,skill_lv,0); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,false); if(sd) clif_skill_fail( *sd, skill_id ); } } @@ -9100,7 +9101,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case TF_STEAL: if(sd) { if(pc_steal_item(sd,bl,skill_lv)) - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); else clif_skill_fail( *sd, skill_id, USESKILL_FAIL ); } @@ -9112,7 +9113,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { dstmd->state.provoke_flag = src->id; mob_target(dstmd, src, skill_get_range2(src, skill_id, skill_lv, true)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } else @@ -9136,7 +9137,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui brate = sd->sc.getSCE(SC_PETROLOGY_OPTION)->val3; if (sc_start2(src, bl, type, (skill_lv * 4 + 20) + brate, skill_lv, src->id, skill_get_time2(skill_id, skill_lv), skill_get_time(skill_id, skill_lv))) - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); else if(sd) { clif_skill_fail( *sd, skill_id ); // Level 6-10 doesn't consume a red gem if it fails [celest] @@ -9150,31 +9151,31 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case NV_FIRSTAID: - clif_skill_nodamage(src,bl,skill_id,5,1); + clif_skill_nodamage(src,*bl,skill_id,5); status_heal(bl,5,0,0); break; case AL_CURE: if(status_isimmune(bl)) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,0); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,false); break; } status_change_end(bl, SC_SILENCE); status_change_end(bl, SC_BLIND); status_change_end(bl, SC_CONFUSION); status_change_end(bl, SC_BITESCAR); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case TF_DETOXIFY: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); status_change_end(bl, SC_POISON); status_change_end(bl, SC_DPOISON); break; case PR_STRECOVERY: if(status_isimmune(bl)) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,0); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,false); break; } if (tsc) { @@ -9189,7 +9190,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } if(battle_check_undead(tstatus->race,tstatus->def_ele)) skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, 100, flag); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if(dstmd) mob_unlocktarget(dstmd,tick); break; @@ -9198,31 +9199,31 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MER_BENEDICTION: status_change_end(bl, SC_CURSE); status_change_end(bl, SC_BLIND); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case MER_COMPRESS: status_change_end(bl, SC_BLEEDING); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case MER_MENTALCURE: status_change_end(bl, SC_CONFUSION); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case MER_RECUPERATE: status_change_end(bl, SC_POISON); status_change_end(bl, SC_DPOISON); status_change_end(bl, SC_SILENCE); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case MER_REGAIN: status_change_end(bl, SC_SLEEP); status_change_end(bl, SC_STUN); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case MER_TENDER: status_change_end(bl, SC_FREEZE); status_change_end(bl, SC_STONE); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case MER_SCAPEGOAT: @@ -9247,7 +9248,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); clif_skill_estimation(sd, bl); if( skill_id == MER_ESTIMATION ) sd = nullptr; @@ -9305,7 +9306,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AL_TELEPORT: case ALL_ODINS_RECALL: - if(sd) + if(sd != nullptr) { if (map_getmapflag(bl->m, MF_NOTELEPORT) && skill_lv <= 2) { clif_skill_teleportmessage( *sd, NOTIFY_MAPINFO_CANT_TP ); @@ -9327,17 +9328,25 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); - if( skill_lv == 1 && skill_id != ALL_ODINS_RECALL ) - clif_skill_warppoint( sd, skill_id, skill_lv, "Random" ); - else - clif_skill_warppoint( sd, skill_id, skill_lv, "Random", sd->status.save_point.map ); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); + + std::vector maps = { + "Random" + }; + + if( skill_lv == 1 && skill_id != ALL_ODINS_RECALL ){ + clif_skill_warppoint( *sd, skill_id, skill_lv, maps ); + }else{ + maps.push_back( sd->status.save_point.map ); + + clif_skill_warppoint( *sd, skill_id, skill_lv, maps ); + } } else unit_warp(bl,-1,-1,-1,CLR_TELEPORT); break; case NPC_EXPULSION: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); unit_warp(bl,-1,-1,-1,CLR_TELEPORT); break; @@ -9347,7 +9356,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui struct skill_unit* su; if ((su = map_find_skill_unit_oncell(bl, bl->x, bl->y, NJ_SUITON, nullptr, 0)) != nullptr) skill_delunit(su); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } else clif_skill_fail( *sd, skill_id ); @@ -9359,7 +9368,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui unsigned char eflag; struct item item_tmp; struct block_list tbl; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); memset(&item_tmp,0,sizeof(item_tmp)); memset(&tbl,0,sizeof(tbl)); // [MouseJstr] item_tmp.nameid = ITEMID_STONE; @@ -9380,7 +9389,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case ASC_CDP: if(sd) { if(skill_produce_mix(sd, skill_id, ITEMID_POISON_BOTTLE, 0, 0, 0, 1, -1)) //Produce a Poison Bottle. - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); else clif_skill_fail( *sd, skill_id, USESKILL_FAIL_STUFF_INSUFFICIENT ); } @@ -9404,7 +9413,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } if( (i = skill_strip_equip(src, bl, skill_id, skill_lv)) || (skill_id != ST_FULLSTRIP && skill_id != GC_WEAPONCRUSH ) ) - clif_skill_nodamage(src,bl,skill_id,skill_lv,i); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,i); //Nothing stripped. if( sd && !i ) @@ -9531,11 +9540,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui hp *= 3; // Heal effectiveness is 3x for Homunculus #endif - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if( hp > 0 || (skill_id == AM_POTIONPITCHER && sp <= 0) ) - clif_skill_nodamage(nullptr,bl,AL_HEAL,hp,1); + clif_skill_nodamage(nullptr,*bl,AL_HEAL,hp,1); if( sp > 0 ) - clif_skill_nodamage(nullptr,bl,MG_SRECOVERY,sp,1); + clif_skill_nodamage(nullptr,*bl,MG_SRECOVERY,sp); if (tsc) { #ifdef RENEWAL if (tsc->getSCE(SC_EXTREMITYFIST)) @@ -9561,13 +9570,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_freeblock_unlock(); // Don't consume item requirements return 0; } - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); } break; case AM_TWILIGHT1: if (sd) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); //Prepare 200 White Potions. if (!skill_produce_mix(sd, skill_id, ITEMID_WHITE_POTION, 0, 0, 0, 200, -1)) clif_skill_fail( *sd, skill_id ); @@ -9575,7 +9584,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case AM_TWILIGHT2: if (sd) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); //Prepare 200 Slim White Potions. if (!skill_produce_mix(sd, skill_id, ITEMID_WHITE_SLIM_POTION, 0, 0, 0, 200, -1)) clif_skill_fail( *sd, skill_id ); @@ -9596,7 +9605,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_fail( *sd, skill_id ); break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_produce_mix(sd, skill_id, ITEMID_ALCOHOL, 0, 0, 0, 100, alcohol_idx-1); skill_produce_mix(sd, skill_id, ITEMID_ACID_BOTTLE, 0, 0, 0, 50, acid_idx-1); skill_produce_mix(sd, skill_id, ITEMID_FIRE_BOTTLE, 0, 0, 0, 50, fire_idx-1); @@ -9606,7 +9615,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (flag&1 || (i = skill_get_splash(skill_id, skill_lv)) < 1) { if (sd && dstsd && !map_flag_vs(sd->bl.m) && (!sd->duel_group || sd->duel_group != dstsd->duel_group) && (!sd->status.party_id || sd->status.party_id != dstsd->status.party_id)) break; // Outside PvP it should only affect party members and no skill fail message - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if((dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) || (tsc && tsc->getSCE(SC_SPIRIT) && tsc->getSCE(SC_SPIRIT)->val2 == SL_ROGUE) //Rogue's spirit defends againt dispel. || rnd()%100 >= 50+10*skill_lv) @@ -9670,7 +9679,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui |BLOWN_DONT_SEND_PACKET #endif )); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); #ifdef RENEWAL if(blew_count > 0) clif_blown(src); // Always blow, otherwise it shows a casting animation. [Lemongrass] @@ -9689,7 +9698,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( mapdata->getMapFlag(MF_NOTELEPORT) && !(mapdata->getMapFlag(MF_BATTLEGROUND) || mapdata_flag_gvg2(mapdata) ) ) { - clif_skill_nodamage(src, bl, TK_HIGHJUMP, skill_lv, 1); + clif_skill_nodamage(src, *bl, TK_HIGHJUMP, skill_lv); break; } else if(dir%2) { //Diagonal @@ -9703,7 +9712,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui int x1 = x + dirx[dir]; int y1 = y + diry[dir]; - clif_skill_nodamage(src,bl,TK_HIGHJUMP,skill_lv,1); + clif_skill_nodamage(src,*bl,TK_HIGHJUMP,skill_lv); if( !map_count_oncell(src->m,x,y,BL_PC|BL_NPC|BL_MOB,0) && map_getcell(src->m,x,y,CELL_CHKREACH) && !map_count_oncell(src->m,x1,y1,BL_PC|BL_NPC|BL_MOB,0) && map_getcell(src->m,x1,y1,CELL_CHKREACH) && unit_movepos(src, x, y, 1, 0)) @@ -9713,7 +9722,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SA_CASTCANCEL: case SO_SPELLFIST: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); unit_skillcastcancel(src,1); if(sd) { int sp = skill_get_sp(sd->skill_id_old,sd->skill_lv_old); @@ -9753,7 +9762,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (skill_lv >= 5 && (!dstsd || map_flag_vs(bl->m))) //HP damage only on pvp-maps when against players. hp = tstatus->max_hp / 50; //Siphon 2% HP at level 5 - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); unit_skillcastcancel(bl, 0); sp = skill_get_sp(ud->skill_id, ud->skill_lv); status_zap(bl, 0, sp); @@ -9772,12 +9781,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case SA_MAGICROD: #ifdef RENEWAL - clif_skill_nodamage(src,src,SA_MAGICROD,skill_lv,1); + clif_skill_nodamage(src,*src,SA_MAGICROD,skill_lv); #endif sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); break; case SA_AUTOSPELL: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (sd) { sd->state.workinprogress = WIP_DISABLE_ALL; clif_autospell( *sd, skill_lv ); @@ -9818,7 +9827,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case BS_GREED: if(sd){ - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinallrange(skill_greed,bl, skill_get_splash(skill_id, skill_lv),BL_ITEM,bl); } @@ -9840,13 +9849,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NPC_CHANGEHOLY: case NPC_CHANGEDARKNESS: case NPC_CHANGETELEKINESIS: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start2(src,bl, type, 100, skill_lv, skill_get_ele(skill_id,skill_lv), skill_get_time(skill_id, skill_lv))); break; case NPC_PROVOCATION: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (md) mob_unlocktarget(md, tick); break; @@ -9857,18 +9866,18 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case NPC_DARKBLESSING: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start2(src,bl,type,(50+skill_lv*5),skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv))); break; case NPC_LICK: status_zap(bl, 0, 100); - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,(skill_lv*20),skill_lv,skill_get_time2(skill_id,skill_lv))); break; case NPC_SUICIDE: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); status_kill(src); //When suiciding, neither exp nor drops is given. break; @@ -9899,7 +9908,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui int i_type = SC_ASPDPOTION0 + skill_lv - 1; if (i_type > SC_ASPDPOTION3) i_type = SC_ASPDPOTION3; - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,(sc_type)i_type,100,skill_lv,skill_lv * 60000)); } break; @@ -9978,29 +9987,29 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case NPC_POWERUP: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start2(src,bl,type,100,200,100,skill_get_time(skill_id, skill_lv))); break; case NPC_AGIUP: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start2(src,bl,type,100,50,100,skill_get_time(skill_id, skill_lv))); break; case NPC_INVISIBLE: //Have val4 passed as 6 is for "infinite cloak" (do not end on attack/skill use). - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start4(src,bl,type,100,skill_lv,0,0,6,skill_get_time(skill_id,skill_lv))); break; case NPC_SIEGEMODE: // Not implemented/used: Gives EFST_SIEGEMODE which reduces speed to 1000. - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case NPC_INVINCIBLEOFF: case MER_INVINCIBLEOFF2: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_change_end(bl, SC_INVINCIBLE); break; @@ -10010,7 +10019,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (hp_rate && status_get_hp(src) > status_get_max_hp(src) / hp_rate) { int gain_hp = tstatus->max_hp * hp_rate / 100; // The earned is the same % of the target HP than it costed the caster. [Skotlex] - clif_skill_nodamage(src,bl,skill_id,status_heal(bl, gain_hp, 0, 0),1); + clif_skill_nodamage(src,*bl,skill_id,status_heal(bl, gain_hp, 0, 0)); } } break; @@ -10020,7 +10029,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sp_rate && status_get_sp(src) > status_get_max_sp(src) / sp_rate) { int gain_sp = tstatus->max_sp * sp_rate / 100; // The earned is the same % of the target SP than it costed the caster. [Skotlex] - clif_skill_nodamage(src,bl,skill_id,status_heal(bl, 0, gain_sp, 0),1); + clif_skill_nodamage(src,*bl,skill_id,status_heal(bl, 0, gain_sp, 0)); } } break; @@ -10095,7 +10104,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (dstsd->special_state.restart_full_recover) per = sper = 100; if ((dstsd == p_sd || dstsd == c_sd) && status_revive(bl, per, sper)) // Only family members can be revived - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } } break; @@ -10112,7 +10121,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } if (flag&1) { // Buff can only be given to parents in 7x7 AoE around baby if (dstsd == f_sd || dstsd == m_sd) - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } else map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); } @@ -10127,7 +10136,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sd) clif_skill_fail( *sd, skill_id ); break; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_heal(bl,0,sp,2); } break; @@ -10143,7 +10152,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // Players can only remove their own traps or traps on Vs maps. if( su && (sg = su->group) && (src->type == BL_MER || sg->src_id == src->id || map_flag_vs(bl->m)) && ( skill_group = skill_db.find(sg->skill_id) ) && skill_group->inf2[INF2_ISTRAP] ) { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if( sd && !(sg->unit_id == UNT_USED_TRAPS || (sg->unit_id == UNT_ANKLESNARE && sg->val2 != 0 )) ) { // prevent picking up expired traps if( battle_config.skill_removetrap_type ) @@ -10187,7 +10196,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; case HT_SPRINGTRAP: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); { struct skill_unit *su=nullptr; if((bl->type==BL_SKILL) && (su=(struct skill_unit *)bl) && (su->group) ){ @@ -10216,13 +10225,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; case BD_ENCORE: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if(sd) unit_skilluse_id(src,src->id,sd->skill_id_dance,sd->skill_lv_dance); break; case TR_RETROSPECTION: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (sd) unit_skilluse_id(src, src->id, sd->skill_id_song, sd->skill_lv_song); break; @@ -10238,7 +10247,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_freeblock_unlock(); return 1; } - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start4(src,bl,type,100,skill_lv,skill_id,src->id,skill_get_time(skill_id,skill_lv),1000)); break; @@ -10257,7 +10266,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } //Has a 55% + skill_lv*5% success chance. - if (!clif_skill_nodamage(src,bl,skill_id,skill_lv, + if (!clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,55+5*skill_lv,skill_lv,skill_get_time(skill_id,skill_lv)))) { if (sd) clif_skill_fail( *sd, skill_id ); @@ -10283,7 +10292,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui dstmd->state.soul_change_flag = 1; sp2 = sstatus->max_sp * 3 /100; status_heal(src, 0, sp2, 2); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; } sp1 = sstatus->sp; @@ -10298,7 +10307,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sp1 = tstatus->sp; status_set_sp(src, sp2, 3); status_set_sp(bl, sp1, 3); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -10336,9 +10345,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } } if(hp > 0) - clif_skill_nodamage(nullptr,bl,AL_HEAL,hp,1); + clif_skill_nodamage(nullptr,*bl,AL_HEAL,hp); if(sp > 0) - clif_skill_nodamage(nullptr,bl,MG_SRECOVERY,sp,1); + clif_skill_nodamage(nullptr,*bl,MG_SRECOVERY,sp); status_heal(bl,hp,sp,0); } break; @@ -10359,12 +10368,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_freeblock_unlock(); // Don't consume item requirements return 0; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case RG_CLEANER: //AppleGirl - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; #ifndef RENEWAL @@ -10373,7 +10382,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (tsc && !tsce && (tsce=tsc->getSCE(SC_DANCING)) && tsce->val4 && (tsce->val1&0xFFFF) != CG_MOONLIT) //Can't use Longing for Freedom while under Moonlight Petals. [Skotlex] { - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); } } @@ -10402,7 +10411,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_zap(src,0,skill_get_sp(skill_id,skill_lv)); // consume sp only if succeeded [Inkfish] card = skill_tarotcard(src, bl, skill_id, skill_lv, tick); // actual effect is executed here clif_specialeffect((card == 6) ? src : bl, EF_TAROTCARD1 + card - 1, AREA); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -10423,7 +10432,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SL_WIZARD: case SL_HIGH: if( sc_start2( src, bl, type, 100, skill_lv, skill_id, skill_get_time( skill_id, skill_lv ) ) ){ - clif_skill_nodamage( src, bl, skill_id, skill_lv, 1 ); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); // 1% chance to erase death count on successful cast if( skill_id == SL_SUPERNOVICE && dstsd && dstsd->die_counter && rnd_chance( 1, 100 ) ){ @@ -10444,7 +10453,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SP_SOULFALCON: case SP_SOULFAIRY: if( sc_start( src, bl, type, 100, skill_lv, skill_get_time( skill_id, skill_lv ) ) ){ - clif_skill_nodamage( src, bl, skill_id, skill_lv, 1 ); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); }else{ if( sd ){ clif_skill_fail( *sd, skill_id, USESKILL_FAIL ); @@ -10482,7 +10491,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NOTICKDEF|SCSTART_NORATEDEF); break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); if (skill_id == SL_SKE) sc_start(src,src,SC_SMA,100,skill_lv,skill_get_time(SL_SMA,skill_lv)); break; @@ -10495,12 +10504,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if(flag&1) { if (status_get_guild_id(src) == status_get_guild_id(bl)) { if( skill_id == GD_RESTORE ) - clif_skill_nodamage(src,bl,AL_HEAL,status_percent_heal(bl,90,90),1); + clif_skill_nodamage(src,*bl,AL_HEAL,status_percent_heal(bl,90,90)); else sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id, skill_lv)); } } else if (status_get_guild_id(src)) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_PC, src,skill_id,skill_lv,tick, flag|BCT_GUILD|1, @@ -10532,7 +10541,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui default: calls = 0; break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); for (i = 0; i < g->guild.max_member && (!calls || (calls && called < calls)); i++, j++) { if (j > 8) j = 0; @@ -10577,7 +10586,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (pc_setpos(sd, map_id2index(mob_bl->m), mob_bl->x, mob_bl->y, CLR_RESPAWN) != SETPOS_OK) clif_skill_fail( *sd, skill_id ); else - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } else if (sd) clif_skill_fail( *sd, skill_id ); break; @@ -10594,7 +10603,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SG_HATE: if (sd) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (!pc_set_hate_mob(sd, skill_lv-1, bl)) clif_skill_fail( *sd, skill_id ); } @@ -10615,12 +10624,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case GS_GLITTERING: if(sd) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if(rnd()%100 < (20+10*skill_lv)) pc_addspiritball(sd,skill_get_time(skill_id,skill_lv),10); else if(sd->spiritball > 0 && !pc_checkskill(sd,RL_RICHS_COIN)) @@ -10634,7 +10643,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { i =65 -5*distance_bl(src,bl); //Base rate if (i < 30) i = 30; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); sc_start(src,bl,SC_STUN, i,skill_lv,skill_get_time2(skill_id,skill_lv)); } break; @@ -10651,7 +10660,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AM_REST: if (sd) { if (hom_vaporize(sd,HOM_ST_REST)) - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); else clif_skill_fail( *sd, skill_id ); } @@ -10673,7 +10682,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (unit_movepos(bl, x, y, 0, false)) clif_blown(bl); // Show the animation on the homunculus only - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); } } else if (hd != nullptr && hd->master != nullptr) @@ -10685,8 +10694,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui i = skill_calc_heal(src, bl, skill_id, rnd_value(1, skill_lv), true); // Official servers send the Heal skill packet with the healed amount, and then the skill packet with 1 as healed amount - clif_skill_nodamage(src, bl, AL_HEAL, i, 1); - clif_skill_nodamage(src, bl, skill_id, 1, 1); + clif_skill_nodamage(src, *bl, AL_HEAL, i); + clif_skill_nodamage(src, *bl, skill_id, 1); status_heal(bl, i, 0, 0); break; case HVAN_EXPLOSION: @@ -10713,7 +10722,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case HFLI_SPEED: case MH_ANGRIFFS_MODUS: case MH_GOLDENE_FERSE: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; @@ -10772,7 +10781,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } else { skill_area_temp[2] = 0; //For SD_PREAMBLE - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv),BL_CHAR, src,skill_id,skill_lv,tick, flag|BCT_ENEMY|SD_PREAMBLE|1, @@ -10784,7 +10793,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_percent_damage(src,bl,0,((skill_lv-1)%5+1)*20,false); else { skill_area_temp[2] = 0; //For SD_PREAMBLE - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv),BL_CHAR, src,skill_id,skill_lv,tick, flag|BCT_ENEMY|SD_PREAMBLE|1, @@ -10796,7 +10805,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( skill_lv > 1 ) sflag |= 4; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinshootrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),splash_target(src),src, skill_id,skill_lv,tick,sflag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id); } @@ -10809,22 +10818,22 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } 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); } else - clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case NPC_TALK: case ALL_WEWISH: case ALL_CATCRY: case ALL_DREAM_SUMMERNIGHT: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case ALL_BUYING_STORE: if( sd ) {// players only, skill allows 5 buying slots - clif_skill_nodamage(src, bl, skill_id, skill_lv, buyingstore_setup(sd, MAX_BUYINGSTORE_SLOTS) ? 0 : 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, buyingstore_setup(sd, MAX_BUYINGSTORE_SLOTS) == 0); } break; case RK_ENCHANTBLADE: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start2(src,bl,type,100,skill_lv,((100+20*skill_lv)*status_get_lv(src))/100+sstatus->int_,skill_get_time(skill_id,skill_lv))); break; case RK_DRAGONHOWLING: @@ -10833,7 +10842,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else { skill_area_temp[2] = 0; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),BL_CHAR, src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_PREAMBLE|1, @@ -10853,7 +10862,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case RK_LUXANIMA: status_change_clear_buffs(bl, SCCB_LUXANIMA); // For bonus_script sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case RK_GIANTGROWTH: case RK_STONEHARDSKIN: @@ -10879,7 +10888,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui rune_level = 9; if (pc_checkskill(sd, RK_RUNEMASTERY) >= rune_level) { if (sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))) - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); else if (skill_id == RK_STONEHARDSKIN) clif_skill_fail( *sd, skill_id, USESKILL_FAIL_HP_INSUFFICIENT ); } else @@ -10889,7 +10898,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NPC_MILLENNIUMSHIELD: if (sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))) - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case RK_FIGHTINGSPIRIT: { @@ -10898,7 +10907,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // val1: ATKBonus: ? // !TODO: Confirm new ATK formula // val2: ASPD boost: [RK_RUNEMASTERYlevel * 4 / 10] * 10 ==> RK_RUNEMASTERYlevel * 4 sc_start2(src,bl,type,100,70 + 7 * runemastery_skill_lv,4 * runemastery_skill_lv,skill_get_time(skill_id,skill_lv)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; } @@ -10915,7 +10924,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl, SC_ROLLINGCUTTER); } sc_start(src,bl,SC_ROLLINGCUTTER,100,count,skill_get_time(skill_id,skill_lv)); - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); } break; @@ -10924,26 +10933,26 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl, SC_WEAPONBLOCKING); else sc_start(src,bl,SC_WEAPONBLOCKING,100,skill_lv,skill_get_time(skill_id,skill_lv)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case GC_CREATENEWPOISON: if( sd ) { clif_skill_produce_mix_list( *sd, skill_id, 25 ); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; case GC_POISONINGWEAPON: if( sd ) { clif_poison_list( *sd, skill_lv ); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case GC_ANTIDOTE: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if( tsc ) { status_change_end(bl, SC_PARALYSE); @@ -10959,7 +10968,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case GC_PHANTOMMENACE: clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR, src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); break; @@ -10976,13 +10985,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( sd ) clif_skill_fail( *sd, skill_id, USESKILL_FAIL_HP_INSUFFICIENT ); break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); } break; case AB_ANCILLA: if( sd ) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_produce_mix(sd, skill_id, ITEMID_ANCILLA, 0, 0, 0, 1, -1); } break; @@ -10993,7 +11002,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui int bless_lv = ((sd) ? pc_checkskill(sd,AL_BLESSING) : skill_get_max(AL_BLESSING)) + (((sd) ? sd->status.job_level : 50) / 10); int agi_lv = ((sd) ? pc_checkskill(sd,AL_INCAGI) : skill_get_max(AL_INCAGI)) + (((sd) ? sd->status.job_level : 50) / 10); if( sd == nullptr || sd->status.party_id == 0 || flag&1 ) - clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(src,bl,type,100, + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start(src,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 ) 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); @@ -11004,9 +11013,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AB_RENOVATIO: if( !sd || sd->status.party_id == 0 || flag&1 ) { if (skill_id == AB_PRAEFATIO) - clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, skill_lv, 0, 0, (sd && sd->status.party_id ? party_foreachsamemap(party_sub_count, sd, 0) : 1 ), skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start4(src, bl, type, 100, skill_lv, 0, 0, (sd && sd->status.party_id ? party_foreachsamemap(party_sub_count, sd, 0) : 1 ), skill_get_time(skill_id, skill_lv))); else - clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } 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; @@ -11023,7 +11032,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( (dstsd && pc_ismadogear(dstsd)) || status_isimmune(bl)) i = 0; // Should heal by 0 or won't do anything?? in iRO it breaks the healing to members.. [malufett] - clif_skill_nodamage(src, bl, skill_id, i, 1); + clif_skill_nodamage(src, *bl, skill_id, i); if( tsc && tsc->getSCE(SC_AKAITSUKI) && i ) i = ~i + 1; status_heal(bl, i, 0, 0); @@ -11038,7 +11047,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui i = skill_calc_heal(src, bl, AL_HEAL, 10, true); if (status_isimmune(bl)) i = 0; - clif_skill_nodamage(src, bl, skill_id, i, 1); + clif_skill_nodamage(src, *bl, skill_id, i); if( tsc && tsc->getSCE(SC_AKAITSUKI) && i ) i = ~i + 1; status_heal(bl, i, 0, 0); @@ -11047,7 +11056,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else { map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_MOB, src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -11057,7 +11066,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else { map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -11074,7 +11083,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl, SC_FREEZING); status_change_end(bl, SC_CRYSTALIZE); } else //Success rate only applies to the curing effect and not stat bonus. Bonus status only applies to non infected targets - clif_skill_nodamage(bl, bl, skill_id, skill_lv, + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } else if( sd ) party_foreachsamemap(skill_area_sub, sd, skill_get_splash(skill_id, skill_lv), @@ -11092,7 +11101,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl, SC_SILENCE); status_change_end(bl, SC_DEEPSLEEP); } else // Success rate only applies to the curing effect and not stat bonus. Bonus status only applies to non infected targets - clif_skill_nodamage(bl, bl, skill_id, skill_lv, + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } else if( sd ) party_foreachsamemap(skill_area_sub, sd, skill_get_splash(skill_id, skill_lv), @@ -11105,7 +11114,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( bl->type != BL_MOB && battle_check_target(src,bl,BCT_PARTY) <= 0 ) // Only affect mob or party. break; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if(rnd()%100 >= 60 + 8 * skill_lv) { if (sd) @@ -11159,7 +11168,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // Should the level of Lex Divina be equivalent to the level of Silentium or should the highest level learned be used? [LimitLine] map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, PR_LEXDIVINA, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case WL_STASIS: @@ -11169,7 +11178,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui struct map_data *mapdata = map_getmapdata(src->m); map_foreachinallrange(skill_area_sub,src,skill_get_splash(skill_id, skill_lv),BL_CHAR,src,skill_id,skill_lv,tick,(mapdata_flag_vs(mapdata)?BCT_ALL:BCT_ENEMY|BCT_SELF)|flag|1,skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -11195,7 +11204,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( !(tsc && tsc->getSCE(type)) ){ i = sc_start2(src,bl,type,rate,skill_lv,src->id,(src == bl)?5000:(bl->type == BL_PC)?skill_get_time(skill_id,skill_lv):skill_get_time2(skill_id, skill_lv)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,i); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,i); if( sd && !i ) clif_skill_fail( *sd, skill_id ); } @@ -11205,7 +11214,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case NPC_JACKFROST: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_foreachinrange(skill_area_sub,bl,skill_get_splash(skill_id,skill_lv),BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); break; @@ -11223,7 +11232,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // IroWiki says Rate should be reduced by target stats, but currently unknown if( rnd()%100 < rate ) { // Success on First Target if( status_change_start(src,bl,type,10000,skill_lv,src->id,0,0,skill_get_time2(skill_id,skill_lv), SCSTART_NOTICKDEF, skill_get_time(skill_id, skill_lv)) ) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_area_temp[1] = bl->id; map_foreachinallrange(skill_area_sub,bl,skill_get_splash(skill_id,skill_lv),BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_nodamage_id); } @@ -11283,7 +11292,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } } - clif_skill_nodamage(src, bl, skill_id, 0, 0); + clif_skill_nodamage(src, *bl, skill_id, 0, false); } break; @@ -11294,14 +11303,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); skill_spellbook(*sd, ITEMID_WL_MB_SG + skill_lv - 1); } break; case RA_FEARBREEZE: clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); break; case RA_WUGMASTERY: @@ -11310,7 +11319,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui pc_setoption(sd,sd->sc.option|OPTION_WUG); else pc_setoption(sd,sd->sc.option&~OPTION_WUG); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -11323,24 +11332,24 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui pc_setoption(sd,sd->sc.option&~OPTION_WUGRIDER); pc_setoption(sd,sd->sc.option|OPTION_WUG); } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case RA_WUGDASH: if( tsce ) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,status_change_end(bl, type)); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,status_change_end(bl, type)); map_freeblock_unlock(); return 0; } if( sd && pc_isridingwug(sd) ) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start4(src,bl,type,100,skill_lv,unit_getdir(bl),0,0,0)); + clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start4(src,bl,type,100,skill_lv,unit_getdir(bl),0,0,0)); clif_walkok(*sd); } break; case RA_SENSITIVEKEEN: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY,skill_castend_damage_id); break; @@ -11350,7 +11359,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { uint8 dir = (skill_id == NC_F_SIDESLIDE) ? (unit_getdir(src)+4)%8 : unit_getdir(src); skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),dir,BLOWN_IGNORE_NO_KNOCKBACK); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -11359,7 +11368,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( pc_ismadogear(sd) ) pc_setmadogear(sd, false); skill_area_temp[1] = 0; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); status_set_sp(src, 0, 0); skill_clear_unitgroup(src); @@ -11367,7 +11376,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case NC_EMERGENCYCOOL: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (sd) { struct s_skill_condition req = skill_get_requirement(sd, skill_id, skill_lv); int16 limit[] = { -45, -75, -105 }; @@ -11414,7 +11423,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } heal = dstsd->status.max_hp * hp / 100; status_heal(bl,heal,0,2); - clif_skill_nodamage(src, bl, skill_id, skill_lv, heal); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, heal != 0); } break; @@ -11424,7 +11433,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui md = map_id2md(bl->id); if( md && md->mob_id >= MOBID_SILVERSNIPER && md->mob_id <= MOBID_MAGICDECOY_WIND ) status_kill(bl); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; case SC_AUTOSHADOWSPELL: @@ -11434,7 +11443,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { sc_start(src,src,SC_STOP,100,skill_lv,INFINITE_TICK);// The skill_lv is stored in val1 used in skill_select_menu to determine the used skill lvl [Xazax] clif_autoshadowspell_list( *sd ); - clif_skill_nodamage(src,bl,skill_id,1,1); + clif_skill_nodamage(src,*bl,skill_id,1); } else clif_skill_fail( *sd, skill_id, USESKILL_FAIL_IMITATION_SKILL_NONE ); @@ -11443,7 +11452,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_SHADOWFORM: if( sd && dstsd && src != bl && !dstsd->shadowform_id ) { - if( clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start4(src,src,type,100,skill_lv,bl->id,4+skill_lv,0,skill_get_time(skill_id, skill_lv))) ) + if( clif_skill_nodamage(src,*bl,skill_id,skill_lv,sc_start4(src,src,type,100,skill_lv,bl->id,4+skill_lv,0,skill_get_time(skill_id, skill_lv))) ) dstsd->shadowform_id = src->id; } else if( sd ) @@ -11465,7 +11474,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src, bl, SC_BLIND, 53 + 2 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv)); } else { - clif_skill_nodamage(src, bl, skill_id, 0, 1); + clif_skill_nodamage(src, *bl, skill_id, 0); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); } @@ -11484,7 +11493,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui rate = status_get_lv(src) / 10 + rnd_value(sstatus->dex / 12, sstatus->dex / 4) + ( sd ? sd->status.job_level : 50 ) + 10 * skill_lv - (status_get_lv(bl) / 10 + rnd_value(tstatus->agi / 6, tstatus->agi / 3) + tstatus->luk / 10 + ( dstsd ? (dstsd->max_weight / 10 - dstsd->weight / 10 ) / 100 : 0)); rate = cap_value(rate, skill_lv + sstatus->dex / 20, 100); - clif_skill_nodamage(src,bl,skill_id,0,sc_start(src,bl,type,rate,skill_lv,skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src,*bl,skill_id,0,sc_start(src,bl,type,rate,skill_lv,skill_get_time(skill_id,skill_lv))); } else if( sd ) clif_skill_fail( *sd, skill_id ); break; @@ -11498,7 +11507,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui rate = status_get_lv(src) / 10 + rnd_value(sstatus->dex / 12, sstatus->dex / 4) + ( sd ? sd->status.job_level : 50 ) + 10 * skill_lv - (status_get_lv(bl) / 10 + rnd_value(tstatus->agi / 6, tstatus->agi / 3) + tstatus->luk / 10 + ( dstsd ? (dstsd->max_weight / 10 - dstsd->weight / 10 ) / 100 : 0)); rate = cap_value(rate, skill_lv + sstatus->dex / 20, 100); - if (clif_skill_nodamage(src,bl,skill_id,0,sc_start(src,bl,type,rate,skill_lv,skill_get_time(skill_id,skill_lv)))) { + if (clif_skill_nodamage(src,*bl,skill_id,0,sc_start(src,bl,type,rate,skill_lv,skill_get_time(skill_id,skill_lv)))) { int sp = 100 * skill_lv; if( dstmd ) @@ -11525,7 +11534,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl,type); else sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case LG_PIETY: @@ -11534,7 +11543,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else { skill_area_temp[2] = 0; map_foreachinallrange(skill_area_sub,bl,skill_get_splash(skill_id,skill_lv),BL_PC,src,skill_id,skill_lv,tick,flag|SD_PREAMBLE|BCT_PARTY|BCT_SELF|1,skill_castend_nodamage_id); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -11555,7 +11564,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); if( sd ) pc_delspiritball(sd, count, 0); - clif_skill_nodamage(src, src, skill_id, skill_lv, + clif_skill_nodamage(src, *src, skill_id, skill_lv, sc_start2(src,src, SC_CURSEDCIRCLE_ATKER, 100, skill_lv, count, skill_get_time(skill_id,skill_lv))); } break; @@ -11577,7 +11586,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui count = map_forcountinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-charactors BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); if( sd ) pc_delspiritball(sd, count, 0); - clif_skill_nodamage(src, src, skill_id, skill_lv, + clif_skill_nodamage(src, *src, skill_id, skill_lv, sc_start2(src,src, SC_CURSEDCIRCLE_ATKER, 50, skill_lv, count, skill_get_time(skill_id,skill_lv))); } break; @@ -11588,7 +11597,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src,bl, SC_EXPLOSIONSPIRITS, 100, skill_lv, skill_get_time(skill_id, skill_lv)); for( i = 0; i < max; i++ ) // Don't call more than max available spheres. pc_addspiritball(sd, skill_get_time(skill_id, skill_lv), max); - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv,skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv,skill_get_time(skill_id, skill_lv))); } break; @@ -11607,7 +11616,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } if (i) status_percent_heal(src, 0, i); - clif_skill_nodamage(src, bl, skill_id, skill_lv, i ? 1:0); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, i != 0); } else { clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|BCT_SELF|SD_SPLASH|1, skill_castend_nodamage_id); @@ -11623,7 +11632,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui pc_delspiritball(sd, sd->spiritball, 0); } } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); break; case SR_GENTLETOUCH_CURE: @@ -11647,13 +11656,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl, SC_HALLUCINATION); } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case SR_GENTLETOUCH_ENERGYGAIN: case SR_GENTLETOUCH_CHANGE: case SR_GENTLETOUCH_REVITALIZE: - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case SR_FLASHCOMBO: { @@ -11662,7 +11671,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sd) // Disable attacking/acting/moving for skill's duration. sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick = tick + delay[2]; - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,src,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); for (i = 0; i < ARRAYLENGTH(combo); i++) skill_addtimerskill(src,tick + delay[i],bl->id,0,0,combo[i],skill_lv,BF_WEAPON,flag|SD_LEVEL); @@ -11675,19 +11684,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MI_RUSH_WINDMILL: case MI_ECHOSONG: if( !sd || !sd->status.party_id || (flag & 1) ) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); sc_start2(src,bl,type,100,skill_lv,((sd) ? pc_checkskill(sd,WM_LESSON) : skill_get_max(WM_LESSON)),skill_get_time(skill_id,skill_lv)); } 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); sc_start2(src,bl,type,100,skill_lv,((sd) ? pc_checkskill(sd,WM_LESSON) : skill_get_max(WM_LESSON)),skill_get_time(skill_id,skill_lv)); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case MI_HARMONIZE: if( src != bl ) - clif_skill_nodamage(src, src, skill_id, skill_lv, sc_start(src,src, type, 100, skill_lv, skill_get_time(skill_id,skill_lv))); - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src, *src, skill_id, skill_lv, sc_start(src,src, type, 100, skill_lv, skill_get_time(skill_id,skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id,skill_lv))); break; case WM_DEADHILLHERE: @@ -11697,7 +11706,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui tstatus->hp = max(tstatus->sp, 1); tstatus->sp -= tstatus->sp * ( 60 - 10 * skill_lv ) / 100; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); pc_revive(reinterpret_cast(bl),true,true); clif_resurrection( *bl ); } @@ -11711,12 +11720,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui skill_area_temp[5] = skill_lv * 6 + ((sd) ? pc_checkskill(sd, WM_LESSON) : 1) * 2 + (sd ? sd->status.job_level : 50) / 2; skill_area_temp[6] = skill_get_time(skill_id,skill_lv); map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ALL|BCT_WOS|1, skill_castend_nodamage_id); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; case WM_GLOOMYDAY: - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if( dstsd && ( pc_checkskill(dstsd,KN_BRANDISHSPEAR) || pc_checkskill(dstsd,LK_SPIRALPIERCE) || pc_checkskill(dstsd,CR_SHIELDCHARGE) || pc_checkskill(dstsd,CR_SHIELDBOOMERANG) || pc_checkskill(dstsd,PA_SHIELDCHAIN) || pc_checkskill(dstsd,LG_SHIELDPRESS) ) ) @@ -11733,7 +11742,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } else if (sd) { if( rnd()%100 < sstatus->int_ / 6 + sd->status.job_level / 5 + skill_lv * 4 + pc_checkskill(sd, WM_LESSON) ) { // !TODO: What's the Lesson bonus? map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } } break; @@ -11750,7 +11759,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } else if( sd ) { if( sc_start2(src,bl,type,100,skill_lv,pc_checkskill(sd, WM_LESSON),skill_get_time(skill_id,skill_lv)) ) 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); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -11760,7 +11769,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } else { // These affect to all targets around the caster. if( rnd()%100 < 5 + 5 * skill_lv + pc_checkskill(sd, WM_LESSON) ) { // !TODO: What's the Lesson bonus? map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } } break; @@ -11771,7 +11780,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } else { // These affect to all targets around the caster. if( rnd()%100 < 12 + 3 * skill_lv + (sd ? pc_checkskill(sd, WM_LESSON) : 0) ) { // !TODO: What's the Lesson bonus? map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } } break; @@ -11781,7 +11790,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src, bl, type, 100, skill_lv, (sd ? pc_checkskill(sd, WM_LESSON) * 500 : 0) + skill_get_time(skill_id, skill_lv)); // !TODO: Confirm Lesson increase } else { map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -11796,7 +11805,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl, SC_BEYONDOFWARCRY); status_change_end(bl, SC_UNLIMITEDHUMMINGVOICE); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -11898,7 +11907,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, 1, DMG_SINGLE); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); break; case GM_SANDMAN: @@ -11908,7 +11917,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else tsc->opt1 = OPT1_SLEEP; clif_changeoption(bl); - clif_skill_nodamage (src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -11916,7 +11925,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { int rate = (15 + 5 * skill_lv) + status_get_int(src) / 5 + (sd ? sd->status.job_level / 5 : 0) - status_get_int(bl) / 6 - status_get_luk(bl) / 10; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); sc_start(src, bl, type, rate, skill_lv, skill_get_time(skill_id, skill_lv)); } break; @@ -11928,7 +11937,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src, bl, type, rate, skill_lv, duration); } else { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); } break; @@ -11949,7 +11958,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_fail( *sd, skill_id ); break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -11972,7 +11981,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_fail( *sd, skill_id ); break; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -11993,7 +12002,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } sd->skill_id_old = skill_id; elemental_action(sd->ed, bl, tick); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_blockpc_start(sd, skill_id, duration); } break; @@ -12015,14 +12024,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } status_heal(&ed->bl,s_hp,s_sp,3); - clif_skill_nodamage(src,&ed->bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,ed->bl,skill_id,skill_lv); } break; case GN_CHANGEMATERIAL: case SO_EL_ANALYSIS: if( sd ) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); clif_skill_itemlistwindow(sd,skill_id,skill_lv); } break; @@ -12046,7 +12055,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } } else { map_foreachinallrange(skill_area_sub,bl,skill_get_splash(skill_id,skill_lv),BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_nodamage_id); - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); } break; case GN_SLINGITEM: @@ -12099,8 +12108,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } } } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1);// This packet is received twice actually, I think it is to show the animation. + clif_skill_nodamage(src,*bl,skill_id,skill_lv); + clif_skill_nodamage(src,*bl,skill_id,skill_lv);// This packet is received twice actually, I think it is to show the animation. break; case GN_MIX_COOKING: case GN_MAKEBOMB: @@ -12112,7 +12121,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( skill_id != GN_S_PHARMACY && skill_lv > 1 ) qty = 10; clif_cooking_list( *sd, ( skill_id - GN_MIX_COOKING ) + 27, skill_id, qty, skill_id == GN_MAKEBOMB ? 5 : 6 ); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); } break; @@ -12155,7 +12164,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(src,type); status_change_end(bl,type2); } else { - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); if (!(skill_id >= EM_EL_FLAMETECHNIC && skill_id <= EM_EL_DEADLY_POISON)) clif_skill_damage(src, ( skill_id == EL_GUST || skill_id == EL_BLAST || skill_id == EL_WILD_STORM )?src:bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); if( skill_id == EL_WIND_STEP ) // There aren't teleport, just push the master away. @@ -12179,7 +12188,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change *esc = status_get_sc(&ele->bl); sc_type type2 = (sc_type)(type-1); - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); if( (esc && esc->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) { status_change_end(bl,type); status_change_end(src,type2); @@ -12199,7 +12208,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case KO_DOHU_KOUKAI: if (sd) { int ele_type = skill_get_ele(skill_id,skill_lv); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); pc_addspiritcharm(sd,skill_get_time(skill_id,skill_lv),MAX_SPIRITCHARM,ele_type); } break; @@ -12217,7 +12226,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui md2->deletetimer = add_timer (gettick() + skill_get_time(skill_id, skill_lv), mob_timer_delete, md2->bl.id, 0); mob_spawn( md2 ); map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_MOB, src, &md2->bl); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),unit_getdir(bl),BLOWN_NONE); } } @@ -12225,7 +12234,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case KO_KYOUGAKU: if( dstsd && tsc && !tsc->getSCE(type) && rnd()%100 < tstatus->int_/2 ){ - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); }else if( sd ) clif_skill_fail( *sd, skill_id ); @@ -12233,7 +12242,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case KO_JYUSATSU: if( dstsd && tsc && !tsc->getSCE(type) && rnd()%100 < ((45+5*skill_lv) + skill_lv*5 - status_get_int(bl)/2) ){//[(Base chance of success) + (Skill Level x 5) - (int / 2)]%. - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, status_change_start(src,bl,type,10000,skill_lv,0,0,0,skill_get_time(skill_id,skill_lv),SCSTART_NOAVOID|SCSTART_NOTICKDEF)); status_percent_damage(src, bl, tstatus->hp * skill_lv * 5, 0, false); // Does not kill the target. if( status_get_lv(bl) <= status_get_lv(src) ) @@ -12255,7 +12264,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_start(src, bl, SC_CONFUSION, 7500, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NORATEDEF); if (skill_check_unit_movepos(5,src,bl->x,bl->y,0,0)) { - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); clif_blown(src); if (!unit_blown_immune(bl, 0x1)) { unit_movepos(bl,x,y,0,0); @@ -12288,7 +12297,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } } - clif_skill_nodamage(src,bl,skill_id,skill_lv, + clif_skill_nodamage(src,*bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); break; @@ -12311,7 +12320,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui }else{ map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -12381,7 +12390,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui block_list* master_bl = battle_get_master(src); if (master_bl != nullptr){ - clif_skill_nodamage(src,master_bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*master_bl,skill_id,skill_lv); sc_start(src, master_bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); } } break; @@ -12423,7 +12432,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case RL_RICHS_COIN: if (sd) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); for (i = 0; i < 10; i++) pc_addspiritball(sd,skill_get_time(skill_id,skill_lv),10); } @@ -12447,12 +12456,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sd->c_marker[i] = bl->id; status_change_start(src, bl, type, 10000, skill_lv, src->id, 0, 0, skill_get_time(skill_id,skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } // If mob casts this, at least SC_C_MARKER as debuff else { status_change_start(src, bl, type, 10000, skill_lv, src->id, 0, 0, skill_get_time(skill_id,skill_lv), SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; case RL_QD_SHOT: @@ -12464,10 +12473,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); // Main target always receives damage - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_LEVEL); } else { - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); } status_change_end(src, SC_QD_SHOT_READY); // End here to prevent spamming of the skill onto the target. @@ -12478,7 +12487,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sd) { sd->flicker = true; skill_area_temp[1] = 0; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); // Detonate RL_B_TRAP if (pc_checkskill(sd, RL_B_TRAP)) map_foreachinallrange(skill_bind_trap, src, AREA_SIZE, BL_SKILL, src); @@ -12492,7 +12501,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SO_ELEMENTAL_SHIELD: if (!sd || sd->status.party_id == 0 || flag&1) { if (sd && sd->status.party_id == 0) { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (sd->ed && skill_get_state(skill_id) == ST_ELEMENTALSPIRIT2) elemental_delete(sd->ed); } @@ -12500,7 +12509,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui skill_unitsetting(bl, AL_PNEUMA, 1, bl->x, bl->y, 0); } else { - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); if (sd->ed && skill_get_state(skill_id) == ST_ELEMENTALSPIRIT2) elemental_delete(sd->ed); 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); @@ -12509,22 +12518,22 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SU_HIDE: if (tsce) { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_change_end(bl, type); map_freeblock_unlock(); return 0; } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); break; case SU_STOOP: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); break; case SU_SV_ROOTTWIST: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (sd && status_get_class_(bl) == CLASS_BOSS) { clif_skill_fail( *sd, skill_id, USESKILL_FAIL_TOTARGET ); break; @@ -12547,7 +12556,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui heal = 0; else if (status_get_hp(bl) != status_get_max_hp(bl)) heal = ((2 * skill_lv - 1) * 10) * status_get_max_hp(bl) / 100; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); status_heal(bl, heal, 0, 0); } break; @@ -12561,7 +12570,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (skill_id == SU_BUNCHOFSHRIMP && pc_checkskill(sd, SU_SPIRITOFSEA)) duration += skill_get_time2(SU_BUNCHOFSHRIMP, skill_lv); - clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, duration)); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, duration)); } 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); } @@ -12571,7 +12580,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sd == nullptr || sd->status.party_id == 0 || flag&1) { sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); if (sd && (i = pc_checkskill(sd, SU_FRESHSHRIMP)) > 0) { - clif_skill_nodamage(bl, bl, SU_FRESHSHRIMP, i, 1); + clif_skill_nodamage(bl, *bl, SU_FRESHSHRIMP, i, 1); sc_start(src, bl, SC_FRESHSHRIMP, 100, i, skill_get_time(SU_FRESHSHRIMP, i)); } } else if (sd) @@ -12583,7 +12592,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src, bl, SC_FEAR, 100, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start(src, bl, SC_FREEZE, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); //! TODO: What's the duration? } else { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (battle_config.skill_wall_check) map_foreachinshootrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); else @@ -12605,10 +12614,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AB_VITUPERATUM: if (flag&1) - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + clif_skill_nodamage(src, *bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); else { map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -12668,7 +12677,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src, bl, (sc_type)(SC_CP_WEAPON + i_eqp), 100, skill_lv, skill_get_time(skill_id, skill_lv)); } } else if (sd) { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); 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; @@ -12679,7 +12688,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sd == nullptr || sd->status.party_id == 0 || (flag & 1)) sc_start4(src, bl, type, 100, skill_lv, 0, flag, 0, skill_get_time(skill_id, skill_lv)); else if (sd) { - clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv); sd->skill_id_song = skill_id; sd->skill_lv_song = skill_lv; @@ -12696,7 +12705,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (flag & 1) sc_start4(src, bl, type, 100, skill_lv, 0, flag, 0, skill_get_time(skill_id, skill_lv)); else if (sd) { - clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv); sd->skill_id_song = skill_id; sd->skill_lv_song = skill_lv; @@ -12725,7 +12734,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src, bl, SC_HANDICAPSTATE_DEPRESSION, success_chance, skill_lv, skill_get_time2(skill_id, skill_lv)); } } else if (sd) { - clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(bl, *bl, skill_id, skill_lv); sd->skill_id_song = skill_id; sd->skill_lv_song = skill_lv; @@ -12744,15 +12753,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (skill_id == ABR_NET_REPAIR) { heal_amount = tstatus->max_hp * 10 / 100; - clif_skill_nodamage( nullptr, bl, AL_HEAL, heal_amount, 1 ); + clif_skill_nodamage(nullptr, *bl, AL_HEAL, heal_amount); status_heal(bl, heal_amount, 0, 0); } else { // ABR_NET_SUPPORT heal_amount = tstatus->max_sp * 3 / 100; - clif_skill_nodamage( nullptr, bl, MG_SRECOVERY, heal_amount, 1 ); + clif_skill_nodamage(nullptr, *bl, MG_SRECOVERY, heal_amount); status_heal(bl, 0, heal_amount, 0); } } else { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ALLY | SD_SPLASH | 1, skill_castend_nodamage_id); } break; @@ -12763,7 +12772,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui pc_setoption(sd, sd->sc.option | OPTION_FALCON); else pc_setoption(sd, sd->sc.option&~OPTION_FALCON); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -12772,7 +12781,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case EM_SUMMON_ELEMENTAL_PROCELLA: case EM_SUMMON_ELEMENTAL_TERREMOTUS: case EM_SUMMON_ELEMENTAL_SERPENS: { - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (sd == nullptr) break; @@ -12801,7 +12810,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case EM_ELEMENTAL_VEIL: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if (sd == nullptr) break; @@ -12822,7 +12831,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_cooking_list( *sd, 31, skill_id, 1, 7 ); else // BO_BIONIC_PHARMACY clif_cooking_list( *sd, 32, skill_id, 1, 8 ); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); } break; @@ -12832,7 +12841,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MT_SUMMON_ABR_INFINITY: { uint32 abrs[4] = { MOBID_ABR_BATTLE_WARIOR, MOBID_ABR_DUAL_CANNON, MOBID_ABR_MOTHER_NET, MOBID_ABR_INFINITY }; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); mob_data *md = mob_once_spawn_sub(src, src->m, src->x, src->y, "--ja--", abrs[3 - (MT_SUMMON_ABR_INFINITY - skill_id)], "", SZ_SMALL, AI_ABR); @@ -12855,7 +12864,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case BO_HELLTREE: { // A poring is used in the 4th slot as a dummy since the Research Report skill is in between the Creeper and Hell Tree skills. uint32 bionics[5] = { MOBID_BIONIC_WOODENWARRIOR, MOBID_BIONIC_WOODEN_FAIRY, MOBID_BIONIC_CREEPER, MOBID_PORING, MOBID_BIONIC_HELLTREE }; - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); mob_data *md = mob_once_spawn_sub(src, src->m, src->x, src->y, "--ja--", bionics[4 - (BO_HELLTREE - skill_id)], "", SZ_SMALL, AI_BIONIC); @@ -12879,7 +12888,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui #endif case NPC_LEASH: - clif_skill_nodamage( src, bl, skill_id, skill_lv, 1 ); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); if( !skill_check_unit_movepos( 0, bl, src->x, src->y, 1, 1 ) ){ return 0; @@ -12897,13 +12906,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_blown( bl ); }else{ skill_area_temp[2] = 0; // For SD_PREAMBLE - clif_skill_nodamage( src, bl, skill_id, skill_lv, 1 ); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinallrange( skill_area_sub, bl, skill_get_splash( skill_id, skill_lv ), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_PREAMBLE | 1, skill_castend_nodamage_id ); } break; case HN_HELLS_DRIVE: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *bl, skill_id, skill_lv); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | 1, skill_castend_damage_id); break; @@ -12915,9 +12924,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (sd && sd->weapontype1 == W_GATLING) { i = 5; // 11x11 - clif_skill_nodamage(src, bl, NW_THE_VIGILANTE_AT_NIGHT_GUN_GATLING, skill_lv, 1); + clif_skill_nodamage(src, *bl, NW_THE_VIGILANTE_AT_NIGHT_GUN_GATLING, skill_lv); } else - clif_skill_nodamage(src, bl, NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN, skill_lv, 1); + clif_skill_nodamage(src, *bl, NW_THE_VIGILANTE_AT_NIGHT_GUN_SHOTGUN, skill_lv); map_foreachinrange(skill_area_sub, bl, i, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); if (sc && sc->getSCE(SC_INTENSIVE_AIM_COUNT)) status_change_end(src, SC_INTENSIVE_AIM_COUNT); @@ -12931,13 +12940,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(src, SC_INTENSIVE_AIM_COUNT); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); } - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); break; case NW_HIDDEN_CARD: case NW_AUTO_FIRING_LAUNCHER: sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); break; case NW_GRENADE_FRAGMENT: @@ -12952,13 +12961,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(src, SC_GRENADE_FRAGMENT_5); status_change_end(src, SC_GRENADE_FRAGMENT_6); } - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); break; default: { std::shared_ptr skill = skill_db.find(skill_id); ShowWarning("skill_castend_nodamage_id: missing code case for skill %s(%d)\n", skill ? skill->name : "UNKNOWN", skill_id); - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,*bl,skill_id,skill_lv); map_freeblock_unlock(); return 1; } @@ -13719,7 +13728,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui break; //Effect is displayed on respective switch case. default: if(skill_get_inf(skill_id)&INF_SELF_SKILL) - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); else clif_skill_poseffect(src,skill_id,skill_lv,x,y,tick); } @@ -14024,13 +14033,24 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui break; case AL_WARP: - if(sd) - { - clif_skill_warppoint(sd, skill_id, skill_lv, sd->status.save_point.map, - (skill_lv >= 2) ? sd->status.memo_point[0].map : "", - (skill_lv >= 3) ? sd->status.memo_point[1].map : "", - (skill_lv >= 4) ? sd->status.memo_point[2].map : "" - ); + if(sd != nullptr) { + std::vector maps( MAX_MEMOPOINTS + 1 ); + + maps.push_back( sd->status.save_point.map ); + + if( skill_lv >= 2 ){ + maps.push_back( sd->status.memo_point[0].map ); + + if( skill_lv >= 3 ){ + maps.push_back( sd->status.memo_point[1].map ); + + if( skill_lv >= 4 ){ + maps.push_back( sd->status.memo_point[2].map ); + } + } + } + + clif_skill_warppoint( *sd, skill_id, skill_lv, maps ); } if( sc && sc->getSCE(SC_CURSEDCIRCLE_ATKER) ) //Should only remove after the skill has been casted. status_change_end(src,SC_CURSEDCIRCLE_ATKER); @@ -14353,7 +14373,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui } map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_MOB, src, &group->unit->bl); // Release all targets against the caster skill_blown(src, src, skill_get_blewcount(skill_id, skill_lv), unit_getdir(src), BLOWN_IGNORE_NO_KNOCKBACK); // Don't stop the caster from backsliding if special_state.no_knockback is active - clif_skill_nodamage(src, src, skill_id, skill_lv, 0); + clif_skill_nodamage(src, *src, skill_id, skill_lv, false); sc_start(src, src, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); } break; @@ -14361,7 +14381,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case SC_ESCAPE: skill_unitsetting(src, skill_id, skill_lv, x, y, 0); skill_blown(src, src, skill_get_blewcount(skill_id, skill_lv), unit_getdir(src), BLOWN_IGNORE_NO_KNOCKBACK); // Don't stop the caster from backsliding if special_state.no_knockback is active - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); flag |= 1; break; @@ -14370,7 +14390,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui status_change_end(src,SC_BANDING); else if( (sg = skill_unitsetting(src,skill_id,skill_lv,src->x,src->y,0)) != nullptr ) sc_start4(src,src,SC_BANDING,100,skill_lv,0,0,sg->group_id,skill_get_time(skill_id,skill_lv)); - clif_skill_nodamage(src,src,skill_id,skill_lv,1); + clif_skill_nodamage(src,*src,skill_id,skill_lv); break; case WM_DOMINION_IMPULSE: @@ -14536,7 +14556,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui y = src->y; } - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); + clif_skill_nodamage(src, *src, skill_id, skill_lv); if (!map_count_oncell(src->m, x, y, BL_PC|BL_NPC|BL_MOB, 0) && map_getcell(src->m, x, y, CELL_CHKREACH) && unit_movepos(src, x, y, 1, 0)) clif_blown(src); } @@ -16023,6 +16043,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t case UNT_SOLIDTRAP: case UNT_SWIFTTRAP: case UNT_FLAMETRAP: + case UNT_GROUND_GRAVITATION: + case UNT_JACK_FROST_NOVA: skill_attack(skill_get_type(sg->skill_id),ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,0); break; @@ -16071,8 +16093,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t int heal = (int)skill_attack(skill_get_type(sg->skill_id),ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick,0); if (heal > 0) { - clif_skill_nodamage(ss,bl,sg->skill_id,sg->skill_lv,1); - clif_skill_nodamage(nullptr,ss,AL_HEAL,heal,1); + clif_skill_nodamage(ss,*bl,sg->skill_id,sg->skill_lv); + clif_skill_nodamage(nullptr,*ss,AL_HEAL,heal); status_heal(ss,heal,0,0); } } @@ -16125,7 +16147,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; if( status_isimmune(bl) ) heal = 0; - clif_skill_nodamage(&unit->bl, bl, AL_HEAL, heal, 1); + clif_skill_nodamage(&unit->bl, *bl, AL_HEAL, heal); if( tsc && tsc->getSCE(SC_AKAITSUKI) && heal ) heal = ~heal + 1; status_heal(bl, heal, 0, 0); @@ -16145,7 +16167,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; if (status_isimmune(bl)) heal = 0; - clif_skill_nodamage(&unit->bl, bl, AL_HEAL, heal, 1); + clif_skill_nodamage(&unit->bl, *bl, AL_HEAL, heal); status_heal(bl, heal, 0, 0); } break; @@ -16328,7 +16350,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t heal = skill_calc_heal(ss,bl,sg->skill_id, sg->skill_lv, true); if (tsc->getSCE(SC_AKAITSUKI) && heal) heal = ~heal + 1; - clif_skill_nodamage(&unit->bl, bl, AL_HEAL, heal, 1); + clif_skill_nodamage(&unit->bl, *bl, AL_HEAL, heal); status_heal(bl, heal, 0, 0); } break; @@ -16350,7 +16372,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t { case 0: // Heal 1000~9999 HP heal = rnd() % 9000 + 1000; - clif_skill_nodamage(ss, bl, AL_HEAL, heal, 1); + clif_skill_nodamage(ss, *bl, AL_HEAL, heal); status_heal(bl, heal, 0, 0); break; case 1: // End all negative status @@ -16421,7 +16443,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t sc_start2(ss, bl, SC_POISON, 100, 1, ss->id, 1800000); //30 minutes break; case 5: // Level 10 Provoke - clif_skill_nodamage(nullptr, bl, SM_PROVOKE, 10, sc_start(ss, bl, SC_PROVOKE, 100, 10, INFINITE_TICK)); //Infinite + clif_skill_nodamage(nullptr, *bl, SM_PROVOKE, 10, sc_start(ss, bl, SC_PROVOKE, 100, 10, INFINITE_TICK)); //Infinite break; case 6: // DEF -100% sc_start(ss, bl, SC_INCDEFRATE, 100, -100, 20000); //20 seconds @@ -16486,9 +16508,9 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t hp = tstatus->max_hp * hp / 100; sp = tstatus->max_sp * sp / 100; if (tstatus->hp < tstatus->max_hp) - clif_skill_nodamage(&unit->bl, bl, AL_HEAL, hp, 1); + clif_skill_nodamage(&unit->bl, *bl, AL_HEAL, hp); if (tstatus->sp < tstatus->max_sp) - clif_skill_nodamage(&unit->bl, bl, MG_SRECOVERY, sp, 1); + clif_skill_nodamage(&unit->bl, *bl, MG_SRECOVERY, sp); if (tsc && tsc->getSCE(SC_AKAITSUKI) && hp) hp = ~hp + 1; status_heal(bl, hp, sp, 3); @@ -17177,7 +17199,7 @@ int skill_check_pc_partner(map_session_data *sd, uint16 skill_id, uint16 *skill_ if (c > 0 && sd->sc.getSCE(SC_DANCING) && (tsd = map_id2sd(p_sd[0])) != nullptr) { sd->sc.getSCE(SC_DANCING)->val4 = tsd->bl.id; sc_start4(&sd->bl,&tsd->bl,SC_DANCING,100,skill_id,sd->sc.getSCE(SC_DANCING)->val2,*skill_lv,sd->bl.id,skill_get_time(skill_id,*skill_lv)+1000); - clif_skill_nodamage(&tsd->bl, &sd->bl, skill_id, *skill_lv, 1); + clif_skill_nodamage(&tsd->bl, sd->bl, skill_id, *skill_lv); tsd->skill_id_dance = skill_id; tsd->skill_lv_dance = *skill_lv; #ifdef RENEWAL @@ -19591,7 +19613,7 @@ void skill_repairweapon( map_session_data& sd, int idx ){ return; } - clif_skill_nodamage(&sd.bl,&target_sd->bl,sd.menuskill_id,1,1); + clif_skill_nodamage(&sd.bl,target_sd->bl,sd.menuskill_id,1); item->attribute = 0;/* clear broken state */ diff --git a/src/map/status.cpp b/src/map/status.cpp index 7cf60ca540..b4accad512 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -1647,7 +1647,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in else status_revive(target, sc->getSCE(SC_KAIZEL)->val2, 0); status_change_clear(target,0); - clif_skill_nodamage(target,target,ALL_RESURRECTION,1,1); + clif_skill_nodamage(target,*target,ALL_RESURRECTION,1); sc_start(src,target,SC_KYRIE,100,10,time); if( target->type == BL_MOB ) @@ -1660,7 +1660,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in if (sc && sc->getSCE(SC_ULTIMATE_S) && !map_flag_gvg2(target->m)) { status_revive(target, 100, 100); status_change_clear(target, 0); - clif_skill_nodamage(target, target, ALL_RESURRECTION, 1, 1); + clif_skill_nodamage(target, *target, ALL_RESURRECTION, 1); if (target->type == BL_MOB) ((TBL_MOB*)target)->state.rebirth = 1; @@ -4914,7 +4914,7 @@ int status_calc_pc_sub(map_session_data* sd, uint8 opt) // Client doesn't delete unavailable skills even if we refresh the skill tree, individually delete them. for (i = 0; i < MAX_SKILL; i++) { if (b_skill[i].id != 0 && sd->status.skill[i].id == 0) - clif_deleteskill(sd, b_skill[i].id, true); + clif_deleteskill(*sd, b_skill[i].id, true); } #endif clif_skillinfoblock(sd); @@ -13139,19 +13139,19 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty switch(sce->val1) { case TK_STORMKICK: skill_combo_toggle_inf(bl, TK_JUMPKICK, 0); - clif_skill_nodamage(bl,bl,TK_READYSTORM,1,1); + clif_skill_nodamage(bl,*bl,TK_READYSTORM,1); break; case TK_DOWNKICK: skill_combo_toggle_inf(bl, TK_JUMPKICK, 0); - clif_skill_nodamage(bl,bl,TK_READYDOWN,1,1); + clif_skill_nodamage(bl,*bl,TK_READYDOWN,1); break; case TK_TURNKICK: skill_combo_toggle_inf(bl, TK_JUMPKICK, 0); - clif_skill_nodamage(bl,bl,TK_READYTURN,1,1); + clif_skill_nodamage(bl,*bl,TK_READYTURN,1); break; case TK_COUNTER: skill_combo_toggle_inf(bl, TK_JUMPKICK, 0); - clif_skill_nodamage(bl,bl,TK_READYCOUNTER,1,1); + clif_skill_nodamage(bl,*bl,TK_READYCOUNTER,1); break; default: // Rest just toggle inf to enable autotarget skill_combo_toggle_inf(bl,sce->val1,INF_SELF_SKILL); diff --git a/src/map/trade.cpp b/src/map/trade.cpp index d23de14545..dfebd12116 100644 --- a/src/map/trade.cpp +++ b/src/map/trade.cpp @@ -38,54 +38,58 @@ void trade_traderequest(map_session_data *sd, map_session_data *target_sd) } if (target_sd == nullptr || sd == target_sd) { - clif_tradestart(sd, 1); // character does not exist + clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST); return; } if (target_sd->npc_id) { // Trade fails if you are using an NPC. - clif_tradestart(sd, 2); + clif_traderesponse(*sd, TRADE_ACK_FAILED); return; } if (!battle_config.invite_request_check) { if (target_sd->guild_invite > 0 || target_sd->party_invite > 0 || target_sd->adopt_invite) { - clif_tradestart(sd, 2); + clif_traderesponse(*sd, TRADE_ACK_FAILED); return; } } - if ( sd->trade_partner != 0 ) { // If a character tries to trade to another one then cancel the previous one - map_session_data *previous_sd = map_id2sd(sd->trade_partner); + if ( sd->trade_partner.id != 0 ) { // If a character tries to trade to another one then cancel the previous one + map_session_data *previous_sd = map_id2sd(sd->trade_partner.id); if( previous_sd != nullptr ){ - previous_sd->trade_partner = 0; + previous_sd->trade_partner = {0,0}; clif_tradecancelled( *previous_sd ); } // Once cancelled then continue to the new one. - sd->trade_partner = 0; + sd->trade_partner = {0,0}; clif_tradecancelled( *sd ); } - if (target_sd->trade_partner != 0) { - clif_tradestart(sd, 2); // person is in another trade + if (target_sd->trade_partner.id != 0) { + clif_traderesponse(*sd, TRADE_ACK_FAILED); // person is in another trade return; } if (!pc_can_give_items(sd) || !pc_can_give_items(target_sd)) { // check if both GMs are allowed to trade clif_displaymessage(sd->fd, msg_txt(sd,246)); - clif_tradestart(sd, 2); // GM is not allowed to trade + clif_traderesponse(*sd, TRADE_ACK_FAILED); // GM is not allowed to trade return; } // Players can not request trade from far away, unless they are allowed to use @trade. if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) && (sd->bl.m != target_sd->bl.m || !check_distance_bl(&sd->bl, &target_sd->bl, TRADE_DISTANCE))) { - clif_tradestart(sd, 0); // too far + clif_traderesponse(*sd, TRADE_ACK_TOOFAR); return ; } - target_sd->trade_partner = sd->status.account_id; - sd->trade_partner = target_sd->status.account_id; - clif_traderequest(target_sd, sd->status.name); + target_sd->trade_partner.id = sd->status.account_id; + target_sd->trade_partner.lv = sd->status.base_level; + + sd->trade_partner.id = target_sd->status.account_id; + sd->trade_partner.lv = target_sd->status.base_level; + + clif_traderequest(*target_sd, sd->status.name); } @@ -107,28 +111,28 @@ void trade_tradeack(map_session_data *sd, int type) nullpo_retv(sd); - if (sd->state.trading || !sd->trade_partner) + if (sd->state.trading || !sd->trade_partner.id) return; // Already trading or no partner set. - if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) { - clif_tradestart(sd, 1); // Character does not exist - sd->trade_partner=0; + if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) { + clif_traderesponse(*sd, TRADE_ACK_CHARNOTEXIST); + sd->trade_partner = {0,0}; return; } - if (tsd->state.trading || tsd->trade_partner != sd->bl.id) { - clif_tradestart(sd, 2); - sd->trade_partner=0; + if (tsd->state.trading || tsd->trade_partner.id != sd->bl.id) { + clif_traderesponse(*sd, TRADE_ACK_FAILED); + sd->trade_partner = {0,0}; return; // Already trading or wrong partner. } if (type == 4) { // Cancel - clif_tradestart(tsd, type); - clif_tradestart(sd, type); + clif_traderesponse(*tsd, TRADE_ACK_CANCEL); + clif_traderesponse(*sd, TRADE_ACK_CANCEL); sd->state.deal_locked = 0; - sd->trade_partner = 0; + sd->trade_partner = {0,0}; tsd->state.deal_locked = 0; - tsd->trade_partner = 0; + tsd->trade_partner = {0,0}; return; } @@ -139,21 +143,21 @@ void trade_tradeack(map_session_data *sd, int type) // Check here as well since the original character could had warped. if (!pc_can_use_command(sd, "trade", COMMAND_ATCOMMAND) && (sd->bl.m != tsd->bl.m || !check_distance_bl(&sd->bl, &tsd->bl, TRADE_DISTANCE))) { - clif_tradestart(sd, 0); // too far - sd->trade_partner=0; - tsd->trade_partner = 0; + clif_traderesponse(*sd, TRADE_ACK_TOOFAR); + sd->trade_partner = {0,0}; + tsd->trade_partner = {0,0}; return; } // Check if you can start trade. if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag || tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag) { // Fail - clif_tradestart(sd, 2); - clif_tradestart(tsd, 2); + clif_traderesponse(*sd, TRADE_ACK_FAILED); + clif_traderesponse(*tsd, TRADE_ACK_FAILED); sd->state.deal_locked = 0; - sd->trade_partner = 0; + sd->trade_partner = {0,0}; tsd->state.deal_locked = 0; - tsd->trade_partner = 0; + tsd->trade_partner = {0,0}; return; } @@ -162,8 +166,8 @@ void trade_tradeack(map_session_data *sd, int type) tsd->state.trading = 1; memset(&sd->deal, 0, sizeof(sd->deal)); memset(&tsd->deal, 0, sizeof(tsd->deal)); - clif_tradestart(tsd, type); - clif_tradestart(sd, type); + clif_traderesponse(*tsd, static_cast( type )); + clif_traderesponse(*sd, static_cast( type )); } /** @@ -356,7 +360,7 @@ void trade_tradeadditem(map_session_data *sd, short index, short amount) if( !sd->state.trading || sd->state.deal_locked > 0 ) return; // Can't add stuff. - if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) { + if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) { trade_tradecancel(sd); return; } @@ -453,7 +457,7 @@ void trade_tradeaddzeny(map_session_data* sd, int amount) if( !sd->state.trading || sd->state.deal_locked > 0 ) return; //Can't add stuff. - if( (target_sd = map_id2sd(sd->trade_partner)) == nullptr ) { + if( (target_sd = map_id2sd(sd->trade_partner.id)) == nullptr ) { trade_tradecancel(sd); return; } @@ -478,7 +482,7 @@ void trade_tradeok(map_session_data *sd) if(sd->state.deal_locked || !sd->state.trading) return; - if ((target_sd = map_id2sd(sd->trade_partner)) == nullptr) { + if ((target_sd = map_id2sd(sd->trade_partner.id)) == nullptr) { trade_tradecancel(sd); return; } @@ -500,15 +504,15 @@ void trade_tradecancel(map_session_data *sd) nullpo_retv(sd); - target_sd = map_id2sd(sd->trade_partner); + target_sd = map_id2sd(sd->trade_partner.id); sd->state.isBoundTrading = 0; if(!sd->state.trading) { // Not trade accepted if( target_sd != nullptr ) { - target_sd->trade_partner = 0; + target_sd->trade_partner = {0,0}; clif_tradecancelled( *target_sd ); } - sd->trade_partner = 0; + sd->trade_partner = {0,0}; clif_tradecancelled( *sd ); return; } @@ -529,7 +533,7 @@ void trade_tradecancel(map_session_data *sd) sd->state.deal_locked = 0; sd->state.trading = 0; - sd->trade_partner = 0; + sd->trade_partner = {0,0}; clif_tradecancelled( *sd ); if (!target_sd) @@ -549,7 +553,7 @@ void trade_tradecancel(map_session_data *sd) } target_sd->state.deal_locked = 0; - target_sd->trade_partner = 0; + target_sd->trade_partner = {0,0}; target_sd->state.trading = 0; clif_tradecancelled( *target_sd ); } @@ -569,7 +573,7 @@ void trade_tradecommit(map_session_data *sd) if (!sd->state.trading || !sd->state.deal_locked) //Locked should be 1 (pressed ok) before you can press trade. return; - if ((tsd = map_id2sd(sd->trade_partner)) == nullptr) { + if ((tsd = map_id2sd(sd->trade_partner.id)) == nullptr) { trade_tradecancel(sd); return; } @@ -642,12 +646,12 @@ void trade_tradecommit(map_session_data *sd) } sd->state.deal_locked = 0; - sd->trade_partner = 0; + sd->trade_partner = {0,0}; sd->state.trading = 0; sd->state.isBoundTrading = 0; tsd->state.deal_locked = 0; - tsd->trade_partner = 0; + tsd->trade_partner = {0,0}; tsd->state.trading = 0; tsd->state.isBoundTrading = 0; diff --git a/src/map/trade.hpp b/src/map/trade.hpp index 7567408f49..3f2d207344 100644 --- a/src/map/trade.hpp +++ b/src/map/trade.hpp @@ -4,8 +4,19 @@ #ifndef TRADE_HPP #define TRADE_HPP +#include + class map_session_data; +enum e_ack_trade_response : uint8 { + TRADE_ACK_TOOFAR = 0, + TRADE_ACK_CHARNOTEXIST, + TRADE_ACK_FAILED, + TRADE_ACK_ACCEPT, + TRADE_ACK_CANCEL, + TRADE_ACK_BUSY +}; + void trade_traderequest(map_session_data *sd, map_session_data *target_sd); void trade_tradeack(map_session_data *sd,int type); void trade_tradeadditem(map_session_data *sd,short index,short amount); diff --git a/src/map/unit.cpp b/src/map/unit.cpp index 53ed8eeb21..658b9c4c0b 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -1639,9 +1639,9 @@ TIMER_FUNC(unit_resume_running){ TBL_PC *sd = map_id2sd(id); if (sd && pc_isridingwug(sd)) - clif_skill_nodamage(ud->bl,ud->bl,RA_WUGDASH,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_WUGDASH,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0)); + clif_skill_nodamage(ud->bl,*ud->bl,RA_WUGDASH,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_WUGDASH,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0)); else - clif_skill_nodamage(ud->bl,ud->bl,TK_RUN,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_RUN,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0)); + clif_skill_nodamage(ud->bl,*ud->bl,TK_RUN,ud->skill_lv,sc_start4(ud->bl,ud->bl,SC_RUN,100,ud->skill_lv,unit_getdir(ud->bl),0,0,0)); if (sd) clif_walkok(*sd); @@ -3266,7 +3266,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, if(sd->chatID) chat_leavechat(sd,0); - if(sd->trade_partner) + if(sd->trade_partner.id > 0) trade_tradecancel(sd); searchstore_close(*sd);