From 5452ae4038e6433b5ea03388d5c28835d9389823 Mon Sep 17 00:00:00 2001 From: Singe Horizontal <62802903+Singe-Horizontal@users.noreply.github.com> Date: Tue, 10 Sep 2024 22:19:47 +0200 Subject: [PATCH 01/26] Enable Log reloading (#8612) --- conf/msg_conf/map_msg.conf | 2 ++ src/map/atcommand.cpp | 3 +++ 2 files changed, 5 insertions(+) diff --git a/conf/msg_conf/map_msg.conf b/conf/msg_conf/map_msg.conf index beaa6f074e..e09f88b15d 100644 --- a/conf/msg_conf/map_msg.conf +++ b/conf/msg_conf/map_msg.conf @@ -1823,5 +1823,7 @@ 1534: Usage: @stockall {} 1535: %d items are transferred (%d skipped)! +1536: Log configuration has been reloaded. + //Custom translations import: conf/msg_conf/import/map_msg_eng_conf.txt diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index 3109e4de68..4f18c3bb16 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -4330,6 +4330,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; From c7d9c2cedd069f626323866ff39c4dd96002238f Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 10 Sep 2024 23:31:57 +0200 Subject: [PATCH 02/26] Corrected enchant grade chances from refined level 16+ (#8620) Updated according to https://probability.gnjoy.com/RO/GRADEBUILD/GRADEBUILD/0001 --- db/re/enchantgrade.yml | 80 +++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 40 deletions(-) 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: From 5fcbcda76fa223a1b9d503cc1fc1eb405bbb18ff Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 11 Sep 2024 00:00:34 +0200 Subject: [PATCH 03/26] Corrected "Venomous Chimera" re-spawn timer (#8621) --- npc/re/mobs/dungeons/slabw01.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 88223c56b850af2011d96078d1e5a3fedc797500 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Wed, 11 Sep 2024 00:32:02 +0200 Subject: [PATCH 04/26] Fixed subtype of 28140 (#8622) Fixes #8601 Thanks to @gmragnarok --- db/re/item_db_equip.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/item_db_equip.yml b/db/re/item_db_equip.yml index 639b3f117f..2347cbfd6a 100644 --- a/db/re/item_db_equip.yml +++ b/db/re/item_db_equip.yml @@ -139532,7 +139532,7 @@ Body: AegisName: Ein_BHAXE Name: Saw Axe Type: Weapon - SubType: 1hAxe + SubType: 2hAxe Weight: 5000 Attack: 350 Range: 1 From d815fabc28d09ef9f86be1d8410351aad0a58099 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 11 Sep 2024 01:52:33 +0200 Subject: [PATCH 05/26] Corrected jobs of items 400488 and 400489 (#8624) Fixes #8616 Thanks to @kaninhot004 --- db/re/item_db_equip.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/db/re/item_db_equip.yml b/db/re/item_db_equip.yml index 2347cbfd6a..edf2c6135d 100644 --- a/db/re/item_db_equip.yml +++ b/db/re/item_db_equip.yml @@ -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 From 5bc79f9d0acf7920a075e557e51eda606150ace7 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 11 Sep 2024 14:27:40 +0200 Subject: [PATCH 06/26] Fixed UNT_JACK_FROST_NOVA and UNT_GROUND_GRAVITATION (#8619) * Added missing UNT_JACK_FROST_NOVA and UNT_GROUND_GRAVITATION in skill_unit_onplace_timer (damage over time were missing) --- src/map/skill.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index a796625ffe..1a579d3c5f 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -16035,6 +16035,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; From 1f25ebc90abb07c25a8b059e54dcc0fc49e69ecc Mon Sep 17 00:00:00 2001 From: Haydrich <54556365+Haydrich@users.noreply.github.com> Date: Wed, 11 Sep 2024 06:25:35 -0700 Subject: [PATCH 07/26] Corrected Spore Explosion and Earth Shaker skills effect (#8611) --- db/re/status.yml | 3 +++ src/map/skill.cpp | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) 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/src/map/skill.cpp b/src/map/skill.cpp index 1a579d3c5f..c7d0b59392 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -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: From 00c88167ce31584490677f444e3e5a42835cdf46 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Thu, 12 Sep 2024 11:47:16 -0300 Subject: [PATCH 08/26] Converted ZC_REQ_TAKEOFF_EQUIP_ACK to struct (#8580) --------- Co-authored-by: Lemongrass3110 Co-authored-by: Atemo --- src/map/clif.cpp | 37 ++++++++++++------------------------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 3 --- src/map/packets.hpp | 26 ++++++++++++++++++++++++++ src/map/pc.cpp | 10 +++++----- 5 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 29e25c8111..a34d9a8113 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -4247,35 +4247,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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 51e1f98997..3a2bc89f66 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -874,7 +874,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 diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 9b49220062..7591a05a96 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -60,7 +60,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); @@ -1501,7 +1500,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 +1732,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 diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 5a35037456..0588aa1572 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -852,6 +852,32 @@ struct PACKET_ZC_EQUIP_ARROW { } __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)); diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 106614f600..bb8946c57d 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -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); } } From ae0bb4929cf1088a44fa86b17fa0e6986265b54c Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Thu, 12 Sep 2024 15:17:54 -0300 Subject: [PATCH 09/26] Converted ZC_REQ_EXCHANGE_ITEM&ZC_ACK_EXCHANGE_ITEM to struct (#8581) --------- Co-authored-by: Lemongrass3110 Co-authored-by: Atemo Co-authored-by: Aleos --- src/map/clif.cpp | 72 ++++++++++++------------------ src/map/clif.hpp | 5 ++- src/map/clif_packetdb.hpp | 4 -- src/map/guild.cpp | 2 +- src/map/packets.hpp | 32 +++++++++++++ src/map/party.cpp | 2 +- src/map/pc.hpp | 6 ++- src/map/pet.cpp | 2 +- src/map/trade.cpp | 94 ++++++++++++++++++++------------------- src/map/trade.hpp | 11 +++++ src/map/unit.cpp | 2 +- 11 files changed, 132 insertions(+), 100 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index a34d9a8113..c118718f4a 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" @@ -4646,33 +4645,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 @@ -4680,23 +4673,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); } @@ -12338,13 +12327,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; } @@ -16191,7 +16175,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 3a2bc89f66..951c884612 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; @@ -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 ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 7591a05a96..4999e1f509 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); @@ -100,7 +99,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); @@ -300,8 +298,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); diff --git a/src/map/guild.cpp b/src/map/guild.cpp index 885d1194b9..8023786359 100644 --- a/src/map/guild.cpp +++ b/src/map/guild.cpp @@ -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; } diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 0588aa1572..3435092d13 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; 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.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..d8d13a9363 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); 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 230949bcb2..c600fe4323 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -3239,7 +3239,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); From c4b77f1942279032814864102beed547dd35d6c7 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Thu, 12 Sep 2024 15:51:13 -0300 Subject: [PATCH 10/26] Converted ZC_CHANGE_CHATROOM to struct (#8589) --------- Co-authored-by: Lemongrass3110 Co-authored-by: Aleos --- src/map/chat.cpp | 2 +- src/map/clif.cpp | 51 ++++++++++++++++++++++++++------------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/packets.hpp | 12 +++++++++ 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/map/chat.cpp b/src/map/chat.cpp index 9dcbf966cd..6f4e9075c7 100644 --- a/src/map/chat.cpp +++ b/src/map/chat.cpp @@ -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; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index c118718f4a..bdbf1063fa 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -4472,28 +4472,45 @@ 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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 951c884612..565c79a1c7 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -890,7 +890,7 @@ 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_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 diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 4999e1f509..b2e982276c 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -91,7 +91,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); diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 3435092d13..7bf442f123 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -878,6 +878,18 @@ 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; From 06e2fc95a11002b546c00a14ccacad8a19a9d95b Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Fri, 13 Sep 2024 05:53:23 -0300 Subject: [PATCH 11/26] Converted ZC_REQ_ALLY_GUILD to struct (#8636) --- src/map/clif.cpp | 19 ++++++++----------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/guild.cpp | 2 +- src/map/packets.hpp | 7 +++++++ 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index bdbf1063fa..2bfc58edbb 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -9158,20 +9158,17 @@ void clif_guild_message( const struct mmo_guild& g, uint32 account_id, const cha clif_send(buf, WBUFW(buf,2), &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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 565c79a1c7..1dfddd9a24 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1058,7 +1058,7 @@ 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_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); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index b2e982276c..af9465fdcf 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -191,7 +191,6 @@ 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); diff --git a/src/map/guild.cpp b/src/map/guild.cpp index 8023786359..660ad64f6f 100644 --- a/src/map/guild.cpp +++ b/src/map/guild.cpp @@ -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; } diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 7bf442f123..224cb01bab 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -760,6 +760,13 @@ struct PACKET_ZC_OPEN_EDITDLGSTR { } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_OPEN_EDITDLGSTR, 0x1d4) +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_COMPASS { int16 packetType; uint32 npcId; From d2809156bcf85d1b412fdee46a29720047f4b590 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Fri, 13 Sep 2024 12:57:26 -0300 Subject: [PATCH 12/26] Converted ZC_ACK_REQ_HOSTILE_GUILD to struct (#8639) Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 19 ++++++++----------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/guild.cpp | 6 +++--- src/map/packets.hpp | 6 ++++++ 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 2bfc58edbb..506ffbe0c0 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -9217,24 +9217,21 @@ void clif_guild_delalliance(map_session_data *sd,int guild_id,int flag) } -/// 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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 1dfddd9a24..2939bb9bbb 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1061,7 +1061,7 @@ void clif_guild_message( const struct mmo_guild& g, uint32 account_id, const cha 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_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 af9465fdcf..2f9e5d902c 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -204,7 +204,6 @@ 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); diff --git a/src/map/guild.cpp b/src/map/guild.cpp index 660ad64f6f..ecbd64b749 100644 --- a/src/map/guild.cpp +++ b/src/map/guild.cpp @@ -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. @@ -2082,7 +2082,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco 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); } diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 224cb01bab..c38328a23f 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -767,6 +767,12 @@ struct PACKET_ZC_REQ_ALLY_GUILD { } __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; From 1425705a2a9fcec0d8d75db9ecb232daf632df4a Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 07:47:52 -0300 Subject: [PATCH 13/26] Converted ZC_ACK_REQ_ALLY_GUILD to struct (#8637) Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 19 ++++++++----------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/guild.cpp | 26 +++++++++++++------------- src/map/packets.hpp | 6 ++++++ 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 506ffbe0c0..5484dd815b 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -9172,8 +9172,8 @@ void clif_guild_reqalliance(map_session_data& sd,uint32 account_id,const char *n } -/// 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. @@ -9181,17 +9181,14 @@ 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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 2939bb9bbb..e3bbc97486 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1059,7 +1059,7 @@ 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_allianceack(map_session_data& sd, uint8 flag); void clif_guild_delalliance(map_session_data *sd,int guild_id,int flag); void clif_guild_oppositionack(map_session_data& sd,uint8 flag); void clif_guild_broken( map_session_data& sd, int flag ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 2f9e5d902c..dfe7a43a9a 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -192,7 +192,6 @@ parseable_packet(0x016e,186,clif_parse_GuildChangeNotice,2,6,66); parseable_packet(0x0170,14,clif_parse_GuildRequestAlliance,2,6,10); parseable_packet(0x0172,10,clif_parse_GuildReplyAlliance,2,6); - packet(0x0173,3); packet(0x0174,-1); packet(0x0175,6); packet(0x0176,106); diff --git a/src/map/guild.cpp b/src/map/guild.cpp index ecbd64b749..a2685e630f 100644 --- a/src/map/guild.cpp +++ b/src/map/guild.cpp @@ -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; } } @@ -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; } @@ -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; } @@ -2079,7 +2079,7 @@ int guild_allianceack(int guild_id1,int guild_id2,uint32 account_id1,uint32 acco 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); diff --git a/src/map/packets.hpp b/src/map/packets.hpp index c38328a23f..5b77a1931a 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -760,6 +760,12 @@ 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_REQ_ALLY_GUILD { int16 packetType; uint32 inviterId; From 9761fdf4da2b3800b3374c3728b5417ea6fc1c54 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 12:44:30 -0300 Subject: [PATCH 14/26] Converted ZC_DELETE_RELATED_GUILD to struct (#8638) Co-authored-by: Daegaladh Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 20 ++++++++------------ src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/guild.cpp | 4 ++-- src/map/packets.hpp | 7 +++++++ 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 5484dd815b..4c55475130 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -9192,25 +9192,21 @@ void clif_guild_allianceack(map_session_data& sd,uint8 flag){ } -/// 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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index e3bbc97486..8d57d4d9e0 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1060,7 +1060,7 @@ 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, uint8 flag); -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); 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 ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index dfe7a43a9a..b6aeb08a06 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -205,7 +205,6 @@ parseable_packet(0x0180,6,clif_parse_GuildOpposition,2); 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); diff --git a/src/map/guild.cpp b/src/map/guild.cpp index a2685e630f..097eec8841 100644 --- a/src/map/guild.cpp +++ b/src/map/guild.cpp @@ -2073,7 +2073,7 @@ 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)); } } @@ -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/packets.hpp b/src/map/packets.hpp index 5b77a1931a..d3ecc667c3 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -766,6 +766,13 @@ struct PACKET_ZC_ACK_REQ_ALLY_GUILD { } __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; From 5c7c874f7283bd2d510de4fcbb40953f4ba9b4bd Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 13:25:04 -0300 Subject: [PATCH 15/26] Converted ZC_GUILD_CHAT to struct (#8634) Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 41 +++++++++++++++++++++------------------ src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/guild.cpp | 2 +- src/map/packets.hpp | 7 +++++++ 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 4c55475130..88f9c5126c 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -9133,29 +9133,32 @@ void clif_guild_expulsionlist(map_session_data* sd) } -/// 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 diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 8d57d4d9e0..2736dddf81 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1057,7 +1057,7 @@ 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_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); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index b6aeb08a06..438f4df507 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -201,7 +201,6 @@ 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(0x0182,106); parseable_packet(0x0183,10,clif_parse_GuildDelAlliance,2,6); diff --git a/src/map/guild.cpp b/src/map/guild.cpp index 097eec8841..d788181c0b 100644 --- a/src/map/guild.cpp +++ b/src/map/guild.cpp @@ -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; } diff --git a/src/map/packets.hpp b/src/map/packets.hpp index d3ecc667c3..6c6289532d 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -825,6 +825,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; From 6c41f9bb3fb171ae9072c196fd771371621223d5 Mon Sep 17 00:00:00 2001 From: Jannik Date: Sat, 14 Sep 2024 18:56:01 +0200 Subject: [PATCH 16/26] Fix typos in quest_db parser (#8642) --- src/map/quest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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; } From 70e8518a32b7a5e97bdca450a370a9b9deee235d Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 14:26:49 -0300 Subject: [PATCH 17/26] Implemented /resetcooltime (#8613) Co-authored-by: Lemongrass3110 --- conf/atcommands.yml | 5 +++++ conf/msg_conf/map_msg.conf | 1 + doc/atcommands.txt | 5 +++++ src/map/atcommand.cpp | 46 ++++++++++++++++++++++++++++++++++++++ src/map/clif.cpp | 13 +++++++++++ src/map/clif_packetdb.hpp | 5 ++--- 6 files changed, 72 insertions(+), 3 deletions(-) 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 e09f88b15d..7968680bd3 100644 --- a/conf/msg_conf/map_msg.conf +++ b/conf/msg_conf/map_msg.conf @@ -1824,6 +1824,7 @@ 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/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/src/map/atcommand.cpp b/src/map/atcommand.cpp index 4f18c3bb16..b121a967e6 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 *------------------------------------------*/ @@ -11019,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/clif.cpp b/src/map/clif.cpp index 88f9c5126c..92a3151a90 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -14752,6 +14752,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: diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 438f4df507..2306c5b047 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -1938,9 +1938,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 From fca803220b0a10ce2b2c0640f39667c8a3d5adb7 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 15:06:41 -0300 Subject: [PATCH 18/26] Implemented ZC_WARPLIST packet (#8600) Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 88 +++++++++++++++++++++++++++------------ src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/packets.hpp | 6 +++ src/map/skill.cpp | 43 +++++++++++++------ 5 files changed, 99 insertions(+), 41 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 92a3151a90..aa2d1be441 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -6151,37 +6151,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; } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 2736dddf81..8447827986 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -944,7 +944,7 @@ int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick, bool clif_skill_nodamage(struct block_list *src,struct block_list *dst,uint16 skill_id,int heal,t_tick tick); 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 ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 2306c5b047..fdd967c68d 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -136,7 +136,6 @@ 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 ); diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 6c6289532d..01776f7985 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -1389,6 +1389,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/skill.cpp b/src/map/skill.cpp index c7d0b59392..1f4d9b85ca 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -9319,7 +9319,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 ); @@ -9342,10 +9342,18 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } 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 ); + + 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; @@ -14037,13 +14045,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); From ca86ac12c86a5a6d284ec097287b371867385845 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 17:41:36 -0300 Subject: [PATCH 19/26] Implemented ZC_BAN_LIST3 packet (#8632) Co-authored-by: Lemongrass3110 --- sql-files/main.sql | 1 + sql-files/upgrades/upgrade_20240914.sql | 1 + src/char/char.cpp | 2 +- src/char/int_guild.cpp | 8 +-- src/common/mmo.hpp | 1 + src/map/clif.cpp | 67 +++++++++++++------------ src/map/clif_packetdb.hpp | 1 - 7 files changed, 43 insertions(+), 38 deletions(-) create mode 100644 sql-files/upgrades/upgrade_20240914.sql 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/clif.cpp b/src/map/clif.cpp index aa2d1be441..0fe35cea84 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -9123,47 +9123,48 @@ 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); } @@ -14102,7 +14103,7 @@ void clif_parse_GuildRequestInfo(int fd, map_session_data *sd) 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); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index fdd967c68d..d606848d23 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -180,7 +180,6 @@ 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); From c92a7e529b163cb70aa1755c4ca32e624d570860 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 18:06:38 -0300 Subject: [PATCH 20/26] Converted ZC_POSITION_INFO to struct (#8629) Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 48 ++++++++++++++++++++------------------- src/map/clif_packetdb.hpp | 1 - 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 0fe35cea84..4de1f91b9c 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -8862,34 +8862,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); } @@ -14097,7 +14099,7 @@ 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 ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index d606848d23..ab9887c51a 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -178,7 +178,6 @@ 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(0x0164,-1); parseable_packet(0x0165,30,clif_parse_CreateGuild,2,6); From f3d1541e44bfabc3604f3b9388063bcf24bfcfe2 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 18:57:41 -0300 Subject: [PATCH 21/26] Converted ZC_MYGUILD_BASIC_INFO to struct (#8628) Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 53 ++++++++++++++++++++++----------------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/guild.cpp | 2 +- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 4de1f91b9c..ee1220898c 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -8755,31 +8755,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); } @@ -14090,7 +14097,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 diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 8447827986..43048cf0d7 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1043,7 +1043,7 @@ 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_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] diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index ab9887c51a..89b7985635 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -161,7 +161,6 @@ 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); diff --git a/src/map/guild.cpp b/src/map/guild.cpp index d788181c0b..72bedaa3db 100644 --- a/src/map/guild.cpp +++ b/src/map/guild.cpp @@ -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) ) { From 82a0c503cefa709df1d69c854c24a1614af2b7e0 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 19:29:05 -0300 Subject: [PATCH 22/26] Converted ZC_ACK_GUILD_MENUINTERFACE to struct (#8627) Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 35 +++++++++++++++++++---------------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/guild.cpp | 2 +- src/map/packets.hpp | 6 ++++++ 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index ee1220898c..35716321c2 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -8691,8 +8691,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 @@ -8701,17 +8701,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); } @@ -14069,11 +14070,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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 43048cf0d7..493adeeb0a 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1041,7 +1041,7 @@ 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_memberlist( map_session_data& sd ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 89b7985635..af5bdd1644 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -162,7 +162,6 @@ packet(0x014a,6); packet(0x014b,27); 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); diff --git a/src/map/guild.cpp b/src/map/guild.cpp index 72bedaa3db..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; diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 01776f7985..ca4606959d 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -817,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; From d382b3f55a1af6a3d26aa033b4be1beb339f32c7 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 20:17:17 -0300 Subject: [PATCH 23/26] Converted ZC_DESTROY_ROOM to struct (#8591) Co-authored-by: Aleos Co-authored-by: Lemongrass3110 --- src/map/chat.cpp | 8 ++++---- src/map/clif.cpp | 23 ++++++++--------------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/packets.hpp | 6 ++++++ 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/map/chat.cpp b/src/map/chat.cpp index 6f4e9075c7..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]; @@ -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/clif.cpp b/src/map/clif.cpp index 35716321c2..30d19fbe81 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -4514,23 +4514,16 @@ void clif_changechatstatus(chat_data& cd) { } -/// 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); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 493adeeb0a..82d50f2987 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -888,7 +888,7 @@ 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(chat_data& cd); void clif_refresh_storagewindow(map_session_data *sd); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index af5bdd1644..0bd77dc2fd 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -86,7 +86,6 @@ 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); diff --git a/src/map/packets.hpp b/src/map/packets.hpp index ca4606959d..22ebae31ac 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -1015,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]; From 61b3f4a34d6b76c64d6113bb80bfc4c065c91cf0 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 20:42:12 -0300 Subject: [PATCH 24/26] Converted ZC_USE_SKILL to struct (#8599) Co-authored-by: Atemo Co-authored-by: Lemongrass3110 --- src/map/atcommand.cpp | 6 +- src/map/battle.cpp | 16 +- src/map/clif.cpp | 64 ++- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 2 - src/map/mob.cpp | 2 +- src/map/pc.cpp | 2 +- src/map/pet.cpp | 4 +- src/map/script.cpp | 2 +- src/map/skill.cpp | 836 +++++++++++++++++++------------------- src/map/status.cpp | 12 +- src/map/unit.cpp | 4 +- 12 files changed, 470 insertions(+), 482 deletions(-) diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index b121a967e6..9e80e830ce 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -1286,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; } @@ -3592,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. } @@ -6317,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; 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/clif.cpp b/src/map/clif.cpp index 30d19fbe81..43ca528e5e 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -6076,45 +6076,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; @@ -15063,7 +15053,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 } } } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 82d50f2987..5b5c5f4b35 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -941,7 +941,7 @@ 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, std::vector& maps ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 0bd77dc2fd..5a9439462e 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -133,7 +133,6 @@ 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); parseable_packet(0x011d,2,clif_parse_RequestMemo,0); packet(0x011f,16); @@ -1746,7 +1745,6 @@ // 2013-07-31cRagexe #if PACKETVER >= 20130731 packet(0x09ca,23); // ZC_SKILL_ENTRY5 - packet(0x09cb,17); // ZC_USE_SKILL2 #endif // 2013-08-07Ragexe 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/pc.cpp b/src/map/pc.cpp index bb8946c57d..03bbec9e6b 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -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; } diff --git a/src/map/pet.cpp b/src/map/pet.cpp index d8d13a9363..0c0ffaabf8 100644 --- a/src/map/pet.cpp +++ b/src/map/pet.cpp @@ -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/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 1f4d9b85ca..c2bfc9795b 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)); @@ -2647,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); } @@ -3701,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] @@ -3919,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); @@ -4119,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; @@ -4581,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) { @@ -4682,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 @@ -5288,7 +5288,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)); @@ -5299,7 +5299,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; @@ -5310,12 +5310,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)); @@ -5328,7 +5328,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; @@ -5365,7 +5365,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, @@ -5435,7 +5435,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, @@ -5573,7 +5573,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); @@ -5769,7 +5769,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; @@ -5807,7 +5807,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: @@ -5833,7 +5833,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 ) ){ @@ -5849,7 +5849,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: { @@ -5861,7 +5861,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: @@ -5881,14 +5881,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; @@ -5899,28 +5899,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; @@ -5929,14 +5929,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; } @@ -5970,7 +5970,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); @@ -5979,7 +5979,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; @@ -6130,7 +6130,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; @@ -6179,7 +6179,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; @@ -6312,7 +6312,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); } @@ -6330,12 +6330,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); @@ -6348,7 +6348,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); } } @@ -6377,7 +6377,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 ) @@ -6388,7 +6388,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; @@ -6466,7 +6466,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; @@ -6611,7 +6611,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; @@ -6628,7 +6628,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; @@ -6780,7 +6780,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 } @@ -6827,7 +6827,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); @@ -6837,7 +6837,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); @@ -6850,7 +6850,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); @@ -6863,7 +6863,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; @@ -6874,7 +6874,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); @@ -6886,7 +6886,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; @@ -6935,7 +6935,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; @@ -6989,7 +6989,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); } @@ -7102,7 +7102,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)); @@ -7113,7 +7113,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)); } @@ -7130,7 +7130,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; @@ -7250,7 +7250,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; @@ -7391,7 +7391,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); @@ -7417,8 +7417,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; @@ -7468,7 +7468,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; } @@ -7485,7 +7485,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; @@ -7507,7 +7507,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; @@ -7517,7 +7517,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; @@ -7526,7 +7526,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; @@ -7536,12 +7536,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 { @@ -7559,7 +7559,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 @@ -7601,11 +7601,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); @@ -7616,7 +7616,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)); @@ -7625,24 +7625,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: @@ -7655,7 +7655,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 }; @@ -7671,20 +7671,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); } @@ -7698,7 +7698,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; @@ -7717,7 +7717,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 && @@ -7739,7 +7739,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] @@ -7749,14 +7749,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) @@ -7770,15 +7770,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: @@ -7791,7 +7791,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)); @@ -7805,7 +7805,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); @@ -7833,7 +7833,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: @@ -7842,7 +7842,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. @@ -7851,7 +7851,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)); @@ -7875,13 +7875,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); @@ -8023,25 +8023,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)); @@ -8058,18 +8058,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: @@ -8095,7 +8095,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)); @@ -8103,7 +8103,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); } @@ -8116,15 +8116,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); } } @@ -8135,13 +8135,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; @@ -8152,14 +8152,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 ); @@ -8167,7 +8167,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 ); @@ -8183,12 +8183,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; @@ -8208,13 +8208,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; @@ -8222,7 +8222,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: @@ -8232,7 +8232,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: @@ -8240,11 +8240,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; @@ -8258,20 +8258,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 ); @@ -8280,17 +8280,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); } @@ -8314,14 +8314,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, @@ -8344,7 +8344,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 ) @@ -8403,7 +8403,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); } @@ -8442,7 +8442,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); } @@ -8483,10 +8483,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: @@ -8494,7 +8494,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; @@ -8504,7 +8504,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); } @@ -8555,27 +8555,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; @@ -8585,7 +8585,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, @@ -8635,7 +8635,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)); @@ -8656,7 +8656,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 ) ) @@ -8671,7 +8671,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; @@ -8697,7 +8697,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; @@ -8732,8 +8732,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; @@ -8742,7 +8742,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 @@ -8752,7 +8752,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: @@ -8802,7 +8802,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, @@ -8810,7 +8810,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), @@ -8823,7 +8823,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui //Except for Summoned Marine spheres on non-versus maps, where it's just enemy. i = ((!md || md->special_state.ai == AI_SPHERE) && !map_flag_vs(src->m))? BCT_ENEMY:BCT_ALL; - clif_skill_nodamage(src, src, skill_id, -1, 1); + clif_skill_nodamage(src, *src, skill_id, -1); map_delblock(src); //Required to prevent chain-self-destructions hitting back. map_foreachinshootrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, @@ -8853,7 +8853,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)); } @@ -8872,7 +8872,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) @@ -8884,11 +8884,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; @@ -8899,7 +8899,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) { @@ -8933,15 +8933,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: @@ -8969,10 +8969,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: @@ -8980,27 +8980,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; @@ -9014,7 +9014,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(); @@ -9022,25 +9022,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 @@ -9048,7 +9048,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) { @@ -9061,7 +9061,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 @@ -9069,7 +9069,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 @@ -9079,10 +9079,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 ); } } @@ -9114,7 +9114,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 ); } @@ -9126,7 +9126,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 @@ -9150,7 +9150,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] @@ -9164,31 +9164,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) { @@ -9203,7 +9203,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; @@ -9212,31 +9212,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: @@ -9261,7 +9261,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; @@ -9341,7 +9341,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); std::vector maps = { "Random" @@ -9359,7 +9359,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui 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; @@ -9369,7 +9369,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 ); @@ -9381,7 +9381,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; @@ -9402,7 +9402,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 ); } @@ -9426,7 +9426,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 ) @@ -9553,11 +9553,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)) @@ -9583,13 +9583,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 ); @@ -9597,7 +9597,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 ); @@ -9618,7 +9618,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); @@ -9628,7 +9628,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) @@ -9692,7 +9692,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] @@ -9711,7 +9711,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 @@ -9725,7 +9725,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)) @@ -9735,7 +9735,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); @@ -9775,7 +9775,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); @@ -9794,12 +9794,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 ); @@ -9840,7 +9840,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); } @@ -9862,13 +9862,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; @@ -9879,18 +9879,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; @@ -9921,7 +9921,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; @@ -10000,29 +10000,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; @@ -10032,7 +10032,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; @@ -10042,7 +10042,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; @@ -10117,7 +10117,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; @@ -10134,7 +10134,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); } @@ -10149,7 +10149,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; @@ -10165,7 +10165,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 ) @@ -10209,7 +10209,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) ){ @@ -10238,13 +10238,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; @@ -10260,7 +10260,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; @@ -10279,7 +10279,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 ); @@ -10305,7 +10305,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; @@ -10320,7 +10320,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; @@ -10358,9 +10358,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; @@ -10381,12 +10381,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 @@ -10395,7 +10395,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))); } } @@ -10424,7 +10424,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; @@ -10445,7 +10445,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 ) ){ @@ -10466,7 +10466,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 ); @@ -10504,7 +10504,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; @@ -10517,12 +10517,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, @@ -10554,7 +10554,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; @@ -10599,7 +10599,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; @@ -10616,7 +10616,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 ); } @@ -10637,12 +10637,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)) @@ -10656,7 +10656,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; @@ -10673,7 +10673,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 ); } @@ -10695,7 +10695,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) @@ -10718,8 +10718,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (!bl) bl = src; i = skill_calc_heal(src, bl, skill_id, 1+rnd()%skill_lv, true); //Eh? why double skill packet? - clif_skill_nodamage(src,bl,AL_HEAL,i,1); - clif_skill_nodamage(src,bl,skill_id,i,1); + clif_skill_nodamage(src,*bl,AL_HEAL,i); + clif_skill_nodamage(src,*bl,skill_id,i); status_heal(bl, i, 0, 0); } break; @@ -10734,7 +10734,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; @@ -10793,7 +10793,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, @@ -10805,7 +10805,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, @@ -10817,7 +10817,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); } @@ -10830,22 +10830,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: @@ -10854,7 +10854,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, @@ -10874,7 +10874,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: @@ -10900,7 +10900,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 @@ -10910,7 +10910,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: { @@ -10919,7 +10919,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; } @@ -10936,7 +10936,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; @@ -10945,26 +10945,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); @@ -10980,7 +10980,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; @@ -10997,13 +10997,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; @@ -11014,7 +11014,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); @@ -11025,9 +11025,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; @@ -11044,7 +11044,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); @@ -11059,7 +11059,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); @@ -11068,7 +11068,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; @@ -11078,7 +11078,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; @@ -11095,7 +11095,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), @@ -11113,7 +11113,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), @@ -11126,7 +11126,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) @@ -11180,7 +11180,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: @@ -11190,7 +11190,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; @@ -11216,7 +11216,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 ); } @@ -11226,7 +11226,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; @@ -11244,7 +11244,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); } @@ -11304,7 +11304,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; @@ -11315,14 +11315,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: @@ -11331,7 +11331,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; @@ -11344,24 +11344,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; @@ -11371,7 +11371,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; @@ -11380,7 +11380,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); @@ -11388,7 +11388,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 }; @@ -11435,7 +11435,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; @@ -11445,7 +11445,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: @@ -11455,7 +11455,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 ); @@ -11464,7 +11464,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 ) @@ -11486,7 +11486,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); } @@ -11505,7 +11505,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; @@ -11519,7 +11519,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 ) @@ -11546,7 +11546,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: @@ -11555,7 +11555,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; @@ -11576,7 +11576,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; @@ -11598,7 +11598,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; @@ -11609,7 +11609,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; @@ -11628,7 +11628,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); @@ -11644,7 +11644,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: @@ -11668,13 +11668,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: { @@ -11683,7 +11683,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); @@ -11696,19 +11696,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: @@ -11718,7 +11718,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 ); } @@ -11732,12 +11732,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) ) ) @@ -11754,7 +11754,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; @@ -11771,7 +11771,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; @@ -11781,7 +11781,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; @@ -11792,7 +11792,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; @@ -11802,7 +11802,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; @@ -11817,7 +11817,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; @@ -11919,7 +11919,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: @@ -11929,7 +11929,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; @@ -11937,7 +11937,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; @@ -11949,7 +11949,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; @@ -11970,7 +11970,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 +11993,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; @@ -12014,7 +12014,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; @@ -12036,14 +12036,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; @@ -12067,7 +12067,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: @@ -12120,8 +12120,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: @@ -12133,7 +12133,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; @@ -12176,7 +12176,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. @@ -12200,7 +12200,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); @@ -12220,7 +12220,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; @@ -12238,7 +12238,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); } } @@ -12246,7 +12246,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 ); @@ -12254,7 +12254,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) ) @@ -12276,7 +12276,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); @@ -12309,7 +12309,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; @@ -12332,7 +12332,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; @@ -12402,7 +12402,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; @@ -12444,7 +12444,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); } @@ -12468,12 +12468,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: @@ -12485,10 +12485,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. @@ -12499,7 +12499,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); @@ -12513,7 +12513,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); } @@ -12521,7 +12521,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); @@ -12530,22 +12530,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; @@ -12568,7 +12568,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; @@ -12582,7 +12582,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); } @@ -12592,7 +12592,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) @@ -12604,7 +12604,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 @@ -12626,10 +12626,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; @@ -12689,7 +12689,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; @@ -12700,7 +12700,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; @@ -12717,7 +12717,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; @@ -12746,7 +12746,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; @@ -12765,15 +12765,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; @@ -12784,7 +12784,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; @@ -12793,7 +12793,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; @@ -12822,7 +12822,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; @@ -12843,7 +12843,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; @@ -12853,7 +12853,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); @@ -12876,7 +12876,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); @@ -12900,7 +12900,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; @@ -12918,13 +12918,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; @@ -12936,9 +12936,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); @@ -12952,13 +12952,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: @@ -12973,13 +12973,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; } @@ -13740,7 +13740,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); } @@ -14385,7 +14385,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; @@ -14393,7 +14393,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; @@ -14402,7 +14402,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: @@ -14568,7 +14568,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); } @@ -16105,8 +16105,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); } } @@ -16159,7 +16159,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); @@ -16179,7 +16179,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; @@ -16362,7 +16362,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; @@ -16384,7 +16384,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 @@ -16455,7 +16455,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 @@ -16520,9 +16520,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); @@ -17211,7 +17211,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 @@ -19625,7 +19625,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 2a0710d4c7..1d14afd09e 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; @@ -13137,19 +13137,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/unit.cpp b/src/map/unit.cpp index c600fe4323..eddd3141ab 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); From 077f714e056e077b4866680faf6e7039a305ce60 Mon Sep 17 00:00:00 2001 From: AoShinHo <126742159+AoShinRO@users.noreply.github.com> Date: Sat, 14 Sep 2024 21:49:31 -0300 Subject: [PATCH 25/26] Converted ZC_SKILLINFO_DELETE to struct (#8595) Co-authored-by: Atemo Co-authored-by: Lemongrass3110 --- src/map/atcommand.cpp | 2 +- src/map/chrif.cpp | 4 ++-- src/map/clif.cpp | 26 ++++++++++++-------------- src/map/clif.hpp | 2 +- src/map/clif_packetdb.hpp | 1 - src/map/packets.hpp | 6 ++++++ src/map/pc.cpp | 6 +++--- src/map/skill.cpp | 4 ++-- src/map/status.cpp | 2 +- 9 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index 9e80e830ce..d68bd151d8 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -3792,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; 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 43ca528e5e..e76658f17d 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -5698,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). diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 5b5c5f4b35..ef7a253783 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -933,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 ); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 5a9439462e..17006dc619 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -1209,7 +1209,6 @@ // 2008-11-26aSakexe #if PACKETVER >= 20081126 packet(0x01a2,37); - packet(0x0441,4); #endif // 2008-12-10aSakexe diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 22ebae31ac..2968088048 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -1118,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; diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 03bbec9e6b..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; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index c2bfc9795b..82ef22d6ce 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -3395,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; @@ -3415,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; diff --git a/src/map/status.cpp b/src/map/status.cpp index 1d14afd09e..1bc693031b 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -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); From 29671fa5cd8747667becee80fb54d9f61f359ea4 Mon Sep 17 00:00:00 2001 From: Kanin Temsrisuk Date: Sun, 15 Sep 2024 14:41:05 +0700 Subject: [PATCH 26/26] Fixed Realgar_Shooter_EXE location (#8647) --- db/re/item_db_equip.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/item_db_equip.yml b/db/re/item_db_equip.yml index edf2c6135d..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