diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index 5495e120c5..3109e4de68 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -1314,7 +1314,7 @@ ACMD_FUNC(heal) if ( hp < 0 && sp <= 0 ) { status_damage(nullptr, &sd->bl, -hp, -sp, 0, 0, 0); - clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false); + clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false); clif_displaymessage(fd, msg_txt(sd,156)); // HP or/and SP modified. return 0; } @@ -1325,7 +1325,7 @@ ACMD_FUNC(heal) status_heal(&sd->bl, hp, 0, 0); else { status_damage(nullptr, &sd->bl, -hp, 0, 0, 0, 0); - clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false); + clif_damage(sd->bl,sd->bl, gettick(), 0, 0, -hp, 0, DMG_ENDURE, 0, false); } } diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 9b5854ee65..5889923ae8 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -6920,7 +6920,7 @@ static void battle_calc_attack_gvg_bg(struct Damage* wd, struct block_list *src, if( rdamage > 0 ) { //Item reflect gets calculated before any mapflag reducing is applicated struct block_list *d_bl = battle_check_devotion(src); - rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false); + rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false); if( tsd ) battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_); //Use Reflect Shield to signal this kind of skill trigger [Skotlex] @@ -6991,7 +6991,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); - battle_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD); + 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; if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 ) @@ -7008,7 +7008,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE); clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage, 1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does - clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false); + clif_damage(*src, *target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false); battle_fix_damage(target, src, rdamage, 0, SR_CRESCENTELBOW); status_damage(src, target, rdamage/10, 0, 0, 1, 0); status_change_end(target, SC_CRESCENTELBOW); @@ -7290,7 +7290,7 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr if( attack_type == BF_WEAPON && tsc->getSCE(SC_REFLECTDAMAGE) ) // Don't reflect your own damage (Grand Cross) map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag); else if( attack_type == BF_WEAPON || attack_type == BF_MISC) { - rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false); + rdelay = clif_damage(*src, (d_bl == nullptr) ? *src : *d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false); if( tsd ) battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_); // It appears that official servers give skill reflect damage a longer delay @@ -9731,7 +9731,7 @@ int battle_damage_area(struct block_list *bl, va_list ap) { battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true,false); else battle_fix_damage(src,bl,damage,0,LG_REFLECTDAMAGE); - clif_damage(bl,bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false); + clif_damage(*bl,*bl,tick,amotion,dmotion,damage,1,DMG_ENDURE,0,false); skill_additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick); map_freeblock_unlock(); } @@ -9877,7 +9877,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t uint16 skill_lv = tsc->getSCE(SC_AUTOCOUNTER)->val1; clif_skillcastcancel( *target ); //Remove the casting bar. [Skotlex] - clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. + clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. status_change_end(target, SC_AUTOCOUNTER); skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0); return ATK_BLOCK; @@ -9900,7 +9900,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t status_change_end(target, SC_BLADESTOP_WAIT); if(sc_start4(src,src, SC_BLADESTOP, 100, sd?pc_checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration)) { //Target locked. - clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. + clif_damage(*src, *target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. clif_bladestop(target, src->id, 1); sc_start4(src,target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration); return ATK_BLOCK; @@ -10042,7 +10042,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } } - wd.dmotion = clif_damage(src, target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2, wd.isspdamage); + wd.dmotion = clif_damage(*src, *target, tick, wd.amotion, wd.dmotion, wd.damage, wd.div_ , wd.type, wd.damage2, wd.isspdamage); if (sd && sd->bonus.splash_range > 0 && damage > 0) skill_castend_damage_id(src, target, 0, 1, tick, 0); @@ -10095,7 +10095,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t if (d_sc && d_sc->getSCE(SC_REBOUND_S)) devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100; - clif_damage(d_bl, d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false); + clif_damage(*d_bl, *d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false); battle_fix_damage(src, d_bl, devotion_damage, 0, CR_DEVOTION); } } @@ -10114,7 +10114,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1); if (e_bl && !status_isdead(*e_bl)) { - clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false); + clif_damage(*e_bl, *e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false); battle_fix_damage(src, e_bl, damage, 0, EL_WATER_SCREEN); } } diff --git a/src/map/buyingstore.cpp b/src/map/buyingstore.cpp index 1a1bab8332..4791e0ef73 100644 --- a/src/map/buyingstore.cpp +++ b/src/map/buyingstore.cpp @@ -631,7 +631,7 @@ void buyingstore_reopen( map_session_data* sd ){ if( at->sit ) { pc_setsit(sd); skill_sit(sd, 1); - clif_sitting(&sd->bl); + clif_sitting(sd->bl); } // Immediate save diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 7cc3f77bb6..63adc88381 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -5134,38 +5134,25 @@ static int clif_hallucination_damage() /// 11 = lucky dodge /// 12 = (touch skill?) /// 13 = multi-hit critical -int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage) -{ - unsigned char buf[34]; - status_change *sc; +int clif_damage(block_list& src, block_list& dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage){ int damage = (int)cap_value(sdamage,INT_MIN,INT_MAX); int damage2 = (int)cap_value(sdamage2,INT_MIN,INT_MAX); -#if PACKETVER < 20071113 - const int cmd = 0x8a; - int offset = 0; -#elif PACKETVER < 20131223 - const int cmd = 0x2e1; - int offset = 2; -#else - const int cmd = 0x8c8; - int offset = 3; -#endif - - nullpo_ret(src); - nullpo_ret(dst); if (type != DMG_MULTI_HIT_CRITICAL) type = clif_calc_delay(type,div,damage+damage2,ddelay); - sc = status_get_sc(dst); + + status_change *sc = status_get_sc(&dst); + if(sc && sc->count) { if(sc->getSCE(SC_HALLUCINATION)) { damage = clif_hallucination_damage(); - if(damage2) damage2 = clif_hallucination_damage(); + if(damage2) + damage2 = clif_hallucination_damage(); } } // Calculate what sdelay to send to the client so it applies damage at the same time as the server - if (battle_config.synchronize_damage && src->type == BL_MOB) { + if (battle_config.synchronize_damage && src.type == BL_MOB) { // When a clif_damage packet is sent to the client it will also send "sdelay" (amotion) as value. // The client however does not interpret this value as AttackMotion but incorrectly as an inverted // animation speed modifier, with 432 standing for 1x animation speed. @@ -5175,7 +5162,7 @@ int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int // it displays the damage and makes the target flinch / stop. If the damage frame is undefined, // it instead displays the damage / flinch / stop at the beginning of the second to last frame. // We define the time after which the damage frame shows at 1x speed as clientamotion. - uint16 clientamotion = std::max((uint16)1, status_get_clientamotion(src)); + uint16 clientamotion = std::max((uint16)1, status_get_clientamotion(&src)); // Knowing when the damage frame happens in the animation allows us to synchronize the timing // between client and server using the formula below. @@ -5187,120 +5174,102 @@ int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int sdelay = std::min(sdelay, DEFAULT_ANIMATION_SPEED); } - WBUFW(buf,0) = cmd; - WBUFL(buf,2) = src->id; - WBUFL(buf,6) = dst->id; - WBUFL(buf,10) = client_tick(tick); - WBUFL(buf,14) = sdelay; - WBUFL(buf,18) = ddelay; - if (battle_config.hide_woe_damage && map_flag_gvg(src->m)) { -#if PACKETVER < 20071113 - WBUFW(buf,22) = damage ? div : 0; - WBUFW(buf,27+offset) = damage2 ? div : 0; -#else - WBUFL(buf, 22) = damage ? div : 0; - WBUFL(buf, 27 + offset) = damage2 ? div : 0; -#endif + PACKET_ZC_NOTIFY_ACT p{}; + + p.packetType = HEADER_ZC_NOTIFY_ACT; + p.srcID = src.id; + p.targetID = dst.id; + p.serverTick = client_tick(tick); + p.srcSpeed = sdelay; + p.dmgSpeed = ddelay; + + if (battle_config.hide_woe_damage && map_flag_gvg(src.m)) { + p.damage = damage ? div : 0; + p.damage2 = damage2 ? div : 0; } else { -#if PACKETVER < 20071113 - WBUFW(buf,22) = min(damage, INT16_MAX); - WBUFW(buf,27+offset) = damage2; -#else - WBUFL(buf,22) = damage; - WBUFL(buf,27+offset) = damage2; -#endif + p.damage = static_cast( std::min( damage, static_cast( std::numeric_limits::max() ) ) ); + p.damage2 = static_cast( std::min( damage2, static_cast( std::numeric_limits::max() ) ) ); } + #if PACKETVER >= 20131223 - WBUFB(buf,26) = (spdamage) ? 1 : 0; // IsSPDamage - Displays blue digits. + p.isSPDamage = (spdamage) ? 1 : 0; // IsSPDamage - Displays blue digits. #endif - WBUFW(buf,24+offset) = div; - WBUFB(buf,26+offset) = type; - if(disguised(dst)) { - clif_send(buf, packet_len(cmd), dst, AREA_WOS); - WBUFL(buf,6) = disguised_bl_id( dst->id ); - clif_send(buf, packet_len(cmd), dst, SELF); + p.div = div; + p.type = type; + + if(disguised(&dst)) { + clif_send( &p, sizeof(p), &dst, AREA_WOS); + p.targetID = 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(disguised(src)) { - WBUFL(buf,2) = disguised_bl_id( src->id ); - if (disguised(dst)) - WBUFL(buf,6) = dst->id; -#if PACKETVER < 20071113 - if(damage > 0) WBUFW(buf,22) = -1; - if(damage2 > 0) WBUFW(buf,27) = -1; -#else - if(damage > 0) WBUFL(buf,22) = -1; - if(damage2 > 0) WBUFL(buf,27+offset) = -1; -#endif - clif_send(buf,packet_len(cmd),src,SELF); + if(disguised(&src)) { + p.srcID = disguised_bl_id( src.id ); + if(damage > 0) + p.damage = -1; + if(damage2 > 0) + p.damage2 = -1; + clif_send( &p, sizeof(p), &src, SELF); } - if(src == dst) { - unit_setdir(src, unit_getdir(src)); - } + if(&src == &dst) + unit_setdir(&src, unit_getdir(&src)); // In case this assignment is bypassed by DMG_MULTI_HIT_CRITICAL type = clif_calc_delay(type, div, damage + damage2, ddelay); //Return adjusted can't walk delay for further processing. - return clif_calc_walkdelay(dst, ddelay, type, damage+damage2, div); + return clif_calc_walkdelay(&dst, ddelay, type, damage+damage2, div); } /*========================================== * src picks up dst *------------------------------------------*/ -void clif_takeitem(struct block_list* src, struct block_list* dst) -{ - //clif_damage(src,dst,0,0,0,0,0,DMG_PICKUP_ITEM,0,false); - unsigned char buf[32]; +void clif_takeitem(block_list& src, block_list& dst){ + PACKET_ZC_NOTIFY_ACT p{}; - nullpo_retv(src); - nullpo_retv(dst); - - WBUFW(buf, 0) = 0x8a; - WBUFL(buf, 2) = src->id; - WBUFL(buf, 6) = dst->id; - WBUFB(buf,26) = 1; - clif_send(buf, packet_len(0x8a), src, AREA); + p.packetType = HEADER_ZC_NOTIFY_ACT; + p.srcID = src.id; + p.targetID = dst.id; + p.type = DMG_PICKUP_ITEM; + clif_send(&p, sizeof(p), &src, AREA); } /*========================================== * inform clients in area that `bl` is sitting *------------------------------------------*/ -void clif_sitting(struct block_list* bl) -{ - unsigned char buf[32]; - nullpo_retv(bl); +void clif_sitting(block_list& bl){ + PACKET_ZC_NOTIFY_ACT p{}; - WBUFW(buf, 0) = 0x8a; - WBUFL(buf, 2) = bl->id; - WBUFB(buf,26) = 2; - clif_send(buf, packet_len(0x8a), bl, AREA); + p.packetType = HEADER_ZC_NOTIFY_ACT; + p.srcID = bl.id; + p.type = DMG_SIT_DOWN; - if(disguised(bl)) { - WBUFL(buf, 2) = disguised_bl_id( bl->id ); - clif_send(buf, packet_len(0x8a), bl, SELF); + clif_send(&p, sizeof(p), &bl, AREA); + + if(disguised(&bl)) { + p.srcID = disguised_bl_id( bl.id ); + clif_send(&p, sizeof(p), &bl, SELF); } } /*========================================== * inform clients in area that `bl` is standing *------------------------------------------*/ -void clif_standing(struct block_list* bl) -{ - unsigned char buf[32]; - nullpo_retv(bl); +void clif_standing(block_list& bl){ + PACKET_ZC_NOTIFY_ACT p{}; - WBUFW(buf, 0) = 0x8a; - WBUFL(buf, 2) = bl->id; - WBUFB(buf,26) = 3; - clif_send(buf, packet_len(0x8a), bl, AREA); + p.packetType = HEADER_ZC_NOTIFY_ACT; + p.srcID = bl.id; + p.type = DMG_STAND_UP; - if(disguised(bl)) { - WBUFL(buf, 2) = disguised_bl_id( bl->id ); - clif_send(buf, packet_len(0x8a), bl, SELF); + clif_send(&p, sizeof(p), &bl, AREA); + + if(disguised(&bl)) { + p.srcID = disguised_bl_id( bl.id ); + clif_send(&p, sizeof(p), &bl, SELF); } } @@ -9814,7 +9783,7 @@ void clif_refresh(map_session_data *sd) if( sd->state.vending ) clif_openvending( *sd ); if( pc_issit(sd) ) - clif_sitting(&sd->bl); // FIXME: just send to self, not area + clif_sitting(sd->bl); // FIXME: just send to self, not area if( pc_isdead(sd) ) // When you refresh, resend the death packet. clif_clearunit_single( sd->bl.id, CLR_DEAD, *sd ); else @@ -11572,14 +11541,14 @@ void clif_parse_HowManyConnections(int fd, map_session_data *sd) clif_user_count(sd, map_getusers()); } -void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int target_id, t_tick tick ){ +void clif_parse_ActionRequest_sub( map_session_data& sd, uint8 action_type, int target_id, t_tick tick ){ if (pc_isdead(&sd)) { clif_clearunit_area(sd.bl, CLR_DEAD); return; } // Statuses that don't let the player sit / stand / talk with NPCs (targeted) - if (action_type != 0x00 && action_type != 0x07) { + if (action_type != DMG_NORMAL && action_type != DMG_REPEAT) { if (sd.sc.cant.interact) return; pc_stop_walking(&sd, 1); @@ -11591,8 +11560,8 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta switch(action_type) { - case 0x00: // once attack - case 0x07: // continuous attack + case DMG_NORMAL: // once attack + case DMG_REPEAT: // continuous attack if( pc_cant_act(&sd) ) return; @@ -11613,7 +11582,7 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta sd.idletime_mer = last_tick; unit_attack(&sd.bl, target_id, action_type != 0); break; - case 0x02: // sitdown + case DMG_SIT_DOWN: // sitdown if (battle_config.basic_skill_check && pc_checkskill(&sd, NV_BASIC) < 3 && pc_checkskill(&sd, SU_BASIC_SKILL) < 1) { clif_skill_fail( sd, 1, USESKILL_FAIL_LEVEL, 2 ); break; @@ -11621,7 +11590,7 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta if(pc_issit(&sd)) { //Bugged client? Just refresh them. - clif_sitting(&sd.bl); + clif_sitting(sd.bl); return; } @@ -11648,12 +11617,12 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta pc_setsit(&sd); skill_sit(&sd, true); - clif_sitting(&sd.bl); + clif_sitting(sd.bl); break; - case 0x03: // standup + case DMG_STAND_UP: // standup if (!pc_issit(&sd)) { //Bugged client? Just refresh them. - clif_standing(&sd.bl); + clif_standing(sd.bl); return; } @@ -11673,7 +11642,7 @@ void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int ta if (battle_config.mer_idle_no_share && sd.md && battle_config.idletime_mer_option&IDLE_SIT) sd.idletime_mer = last_tick; skill_sit(&sd, false); - clif_standing(&sd.bl); + clif_standing(sd.bl); } break; } @@ -12102,7 +12071,7 @@ void clif_parse_NpcClicked(int fd,map_session_data *sd) switch (bl->type) { case BL_MOB: case BL_PC: - clif_parse_ActionRequest_sub( *sd, 0x07, bl->id, gettick() ); + clif_parse_ActionRequest_sub( *sd, DMG_REPEAT, bl->id, gettick() ); break; case BL_NPC: #ifdef RENEWAL diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 2b57345b4f..c965b4e0e1 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -861,10 +861,10 @@ void clif_delitem( map_session_data& sd, int index, int amount, short reason ); void clif_update_hp(map_session_data &sd); void clif_updatestatus( map_session_data& sd, _sp type ); void clif_changemanner( map_session_data& sd ); -int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage); // area -void clif_takeitem(struct block_list* src, struct block_list* dst); -void clif_sitting(struct block_list* bl); -void clif_standing(struct block_list* bl); +int clif_damage(block_list& src, block_list& dst, t_tick tick, int sdelay, int ddelay, int64 sdamage, int div, enum e_damage_type type, int64 sdamage2, bool spdamage); // area +void clif_takeitem(block_list& src, block_list& dst); +void clif_sitting(block_list& bl); +void clif_standing(block_list& bl); void clif_sprite_change(struct block_list *bl, int id, int type, int val, int val2, enum send_target target); void clif_changelook(struct block_list *bl,int type,int val); // area void clif_changetraplook(struct block_list *bl,int val); // area @@ -900,7 +900,7 @@ void clif_divorced(map_session_data* sd, const char* name); void clif_callpartner(map_session_data& sd); void clif_playBGM( map_session_data& sd, const char* name ); void clif_soundeffect( struct block_list& bl, const char* name, int type, enum send_target target ); -void clif_parse_ActionRequest_sub( map_session_data& sd, int action_type, int target_id, t_tick tick ); +void clif_parse_ActionRequest_sub( map_session_data& sd, uint8 action_type, int target_id, t_tick tick ); void clif_parse_LoadEndAck(int fd,map_session_data *sd); void clif_hotkeys_send(map_session_data *sd, int tab); diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index 37ba0aead2..8b8421a281 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -37,7 +37,6 @@ packet(0x0084,2); parseable_packet(0x0085,5,clif_parse_WalkToXY,2); parseable_packet(0x0089,7,clif_parse_ActionRequest,2,6); - packet(0x008a,29); packet(0x008b,2); parseable_packet(0x008c,-1,clif_parse_GlobalMessage,2,4); packet(0x008d,-1); @@ -1021,11 +1020,6 @@ packet(0x029b,80); #endif -// 2007-11-13aSakexe -#if PACKETVER >= 20071113 - packet(0x02e1,33); -#endif - // 2007-11-20aSakexe #if PACKETVER >= 20071120 //packet(0x01df,10 <- ???); @@ -1910,7 +1904,6 @@ packet(0x099a,9); // take_off_equipv5 packet(0x099b,8); //maptypeproperty2 // New Packets - packet(0x08C8,34); // ZC_NOTIFY_ACT3 packet(0x08ff,24); // ZC_EFST_SET_ENTER packet(0x0984,28); // ZC_EFST_SET_ENTER2 packet(0x099f,22); // ZC_SKILL_ENTRY4 diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 39aac95240..d903ec0900 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -1934,7 +1934,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick) if (pcdb_checkid(md->vd->class_)) { //Give them walk act/delay to properly mimic players. [Skotlex] - clif_takeitem(&md->bl,tbl); + clif_takeitem(md->bl,*tbl); md->ud.canact_tick = tick + md->status.amotion; unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1); } diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 26f3053d5e..0fd096166a 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -1161,6 +1161,51 @@ struct PACKET_ZC_EL_PAR_CHANGE { } __attribute__((packed)); DEFINE_PACKET_HEADER(ZC_EL_PAR_CHANGE, 0x81e); +#if PACKETVER >= 20131223 +struct PACKET_ZC_NOTIFY_ACT{ + int16 packetType; + int32 srcID; + int32 targetID; + int32 serverTick; + int32 srcSpeed; + int32 dmgSpeed; + int32 damage; + int8 isSPDamage; + uint16 div; + uint8 type; + int32 damage2; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8c8); +#elif PACKETVER >= 20071113 +struct PACKET_ZC_NOTIFY_ACT{ + int16 packetType; + int32 srcID; + int32 targetID; + int32 serverTick; + int32 srcSpeed; + int32 dmgSpeed; + int32 damage; + uint16 div; + uint8 type; + int32 damage2; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x2e1); +#else +struct PACKET_ZC_NOTIFY_ACT{ + int16 packetType; + int32 srcID; + int32 targetID; + int32 serverTick; + int32 srcSpeed; + int32 dmgSpeed; + int16 damage; + uint16 div; + uint8 type; + int16 damage2; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_NOTIFY_ACT, 0x8a); +#endif + // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) #pragma pack( pop ) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index ecd8523b05..5961a13544 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -6128,7 +6128,7 @@ bool pc_takeitem(map_session_data *sd,struct flooritem_data *fitem) //Display pickup animation. pc_stop_attack(sd); - clif_takeitem(&sd->bl,&fitem->bl); + clif_takeitem(sd->bl,fitem->bl); if (fitem->mob_id && (itemdb_search(fitem->item.nameid))->flag.broadcast && @@ -12969,7 +12969,7 @@ bool pc_setstand(map_session_data *sd, bool force){ status_change_end(&sd->bl, SC_TENSIONRELAX); clif_status_load(&sd->bl,EFST_SIT,0); - clif_standing(&sd->bl); //Inform area PC is standing + clif_standing(sd->bl); //Inform area PC is standing //Reset sitting tick. sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0; if( pc_isdead( sd ) ){ diff --git a/src/map/script.cpp b/src/map/script.cpp index bd53f409bf..fc51fcf013 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -15389,7 +15389,7 @@ BUILDIN_FUNC(skilleffect) if (pc_issit(sd) && pc_setstand(sd, false)) { skill_sit(sd, 0); - clif_standing(&sd->bl); + clif_standing(sd->bl); } } @@ -19910,7 +19910,7 @@ BUILDIN_FUNC(unitattack) case BL_PC: { map_session_data* sd = (map_session_data*)unit_bl; - clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? 0x07 : 0x00, target_bl->id, gettick() ); + clif_parse_ActionRequest_sub( *sd, actiontype > 0 ? DMG_REPEAT : DMG_NORMAL, target_bl->id, gettick() ); script_pushint(st, sd->ud.target == target_bl->id); return SCRIPT_CMD_SUCCESS; } @@ -23150,7 +23150,7 @@ BUILDIN_FUNC(sit) if( !pc_issit(sd) ) { pc_setsit(sd); skill_sit(sd, 1); - clif_sitting(&sd->bl); + clif_sitting(sd->bl); } return SCRIPT_CMD_SUCCESS; } @@ -23167,7 +23167,7 @@ BUILDIN_FUNC(stand) if( pc_issit(sd) && pc_setstand(sd, false)) { skill_sit(sd, 0); - clif_standing(&sd->bl); + clif_standing(sd->bl); } return SCRIPT_CMD_SUCCESS; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 15840c2325..5112236830 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -3821,7 +3821,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * case NPC_CRITICALSLASH: case TF_DOUBLE: case GS_CHAINACTION: - dmg.dmotion = clif_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,dmg.type,dmg.damage2,false); + dmg.dmotion = clif_damage(*src,*bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,dmg.type,dmg.damage2,false); break; case AS_SPLASHER: @@ -4050,7 +4050,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100; if (!rmdamage) { - clif_damage(d_bl, d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false); + clif_damage(*d_bl, *d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false); battle_fix_damage(src, d_bl, devotion_damage, 0, 0); } else { bool isDevotRdamage = false; @@ -4060,7 +4060,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * // If !isDevotRdamage, reflected magics are done directly on the target not on paladin // This check is only for magical skill. // For BF_WEAPON skills types track var rdamage and function battle_calc_return_damage - clif_damage(bl, (!isDevotRdamage) ? bl : d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false); + clif_damage(*bl, (!isDevotRdamage) ? *bl : *d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false); battle_fix_damage(bl, (!isDevotRdamage) ? bl : d_bl, devotion_damage, 0, 0); } } else { @@ -4714,7 +4714,7 @@ static TIMER_FUNC(skill_timerskill){ if( (tsd = ((TBL_PC*)target)) && !pc_issit(tsd) ) { pc_setsit(tsd); skill_sit(tsd, true); - clif_sitting(&tsd->bl); + clif_sitting(tsd->bl); } } break; @@ -5008,7 +5008,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui case 4: // THE CHARIOT - 1000 damage, random armor destroyed { battle_fix_damage(src, target, 1000, 0, skill_id); - clif_damage(src, target, tick, 0, 0, 1000, 0, DMG_NORMAL, 0, false); + clif_damage(*src, *target, tick, 0, 0, 1000, 0, DMG_NORMAL, 0, false); if (!status_isdead(*target)) { unsigned short where[] = { EQP_ARMOR, EQP_SHIELD, EQP_HELM }; @@ -5062,7 +5062,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui case 11: // THE DEVIL - 6666 damage, atk and matk halved, cursed { battle_fix_damage(src, target, 6666, 0, skill_id); - clif_damage(src, target, tick, 0, 0, 6666, 0, DMG_NORMAL, 0, false); + clif_damage(*src, *target, tick, 0, 0, 6666, 0, DMG_NORMAL, 0, false); sc_start(src, target, SC_INCATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv)); sc_start(src, target, SC_INCMATKRATE, 100, -50, skill_get_time2(skill_id, skill_lv)); sc_start(src, target, SC_CURSE, skill_lv, 100, skill_get_time2(status_db.getSkill(SC_CURSE), 1)); @@ -5071,7 +5071,7 @@ static int skill_tarotcard(struct block_list* src, struct block_list *target, ui case 12: // THE TOWER - 4444 damage { battle_fix_damage(src, target, 4444, 0, skill_id); - clif_damage(src, target, tick, 0, 0, 4444, 0, DMG_NORMAL, 0, false); + clif_damage(*src, *target, tick, 0, 0, 4444, 0, DMG_NORMAL, 0, false); break; } case 13: // THE STAR - stun @@ -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_damage(src,bl,tick,status_get_amotion(src),0,-1,1,DMG_ENDURE,0,false); //Display an absorbed damage attack. + 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; @@ -9379,7 +9379,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // Commented because of duplicate animation [Lemongrass] // At the moment this displays the pickup animation a second time // If this is required in older clients, we need to add a version check here - //clif_takeitem(&sd->bl,&tbl); + //clif_takeitem(sd->bl,tbl); eflag = pc_additem(sd,&item_tmp,1,LOG_TYPE_PRODUCE); if(eflag) { clif_additem(sd,0,0,eflag); @@ -9773,7 +9773,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // If damage would be lethal, it does not deal damage if (hp && hp < tstatus->hp) { - clif_damage(src, bl, tick, 0, 0, hp, 0, DMG_NORMAL, 0, false); + clif_damage(*src, *bl, tick, 0, 0, hp, 0, DMG_NORMAL, 0, false); status_zap(bl, hp, 0); // Recover 50% of damage dealt status_heal(src, hp / 2, 0, 2); @@ -12267,7 +12267,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (!unit_blown_immune(bl, 0x1)) { unit_movepos(bl,x,y,0,0); if (bl->type == BL_PC && pc_issit((TBL_PC*)bl)) - clif_sitting(bl); //Avoid sitting sync problem + clif_sitting(*bl); //Avoid sitting sync problem clif_blown(bl); map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_CHAR, src, bl); } @@ -20611,7 +20611,7 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit) return false; } - status_damage(bl, src, damage, 0, clif_damage(src, src, gettick(), 500, 500, damage, hit, (hit > 1 ? DMG_MULTI_HIT : DMG_NORMAL), 0, false), 0, SC__SHADOWFORM); + status_damage(bl, src, damage, 0, clif_damage(*src, *src, gettick(), 500, 500, damage, hit, (hit > 1 ? DMG_MULTI_HIT : DMG_NORMAL), 0, false), 0, SC__SHADOWFORM); if( sc && sc->getSCE(SC__SHADOWFORM) && (--sc->getSCE(SC__SHADOWFORM)->val3) <= 0 ) { status_change_end(bl, SC__SHADOWFORM); if( src->type == BL_PC ) diff --git a/src/map/status.cpp b/src/map/status.cpp index e67dd3660a..3afe5c9c00 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -11173,7 +11173,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if (sd) { pc_setsit(sd); skill_sit(sd, true); - clif_sitting(&sd->bl); + clif_sitting(sd->bl); } val2 = 12; // SP cost tick_time = 10000; // Decrease at 10secs intervals. @@ -11952,7 +11952,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if( sd && !pc_issit(sd) ) { pc_setsit(sd); skill_sit(sd, true); - clif_sitting(bl); + clif_sitting(*bl); } break; case SC_DANCEWITHWUG: @@ -13637,7 +13637,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) struct block_list* src = map_id2bl(sce->val2); if( tid == -1 || !src) break; // Terminated by Damage - status_fix_damage(src,bl,400*sce->val1,clif_damage(bl,bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON); + status_fix_damage(src,bl,400*sce->val1,clif_damage(*bl,*bl,gettick(),0,0,400*sce->val1,0,DMG_NORMAL,0,false),WL_WHITEIMPRISON); } break; case SC_WUGDASH: @@ -13710,7 +13710,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) break; case SC_GRAVITYCONTROL: - status_fix_damage(bl, bl, sce->val2, clif_damage(bl, bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0); + status_fix_damage(bl, bl, sce->val2, clif_damage(*bl, *bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0); clif_specialeffect(bl, 223, AREA); clif_specialeffect(bl, 330, AREA); break; @@ -14064,7 +14064,7 @@ TIMER_FUNC(status_change_timer){ int64 damage = 1000 + (3 * status->max_hp) / 100; // Deals fixed (1000 + 3%*MaxHP) map_freeblock_lock(); dounlock = true; - status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0); + status_fix_damage(bl, bl, damage, clif_damage(*bl, *bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0); } break; @@ -14073,7 +14073,7 @@ TIMER_FUNC(status_change_timer){ if (sce->val3 == 1) { // Target map_freeblock_lock(); dounlock = true; - status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0); + status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0); } else { // Caster interval = 1000; // Assign here since status_get_sc_internval() contains the target interval. @@ -14132,7 +14132,7 @@ TIMER_FUNC(status_change_timer){ if (sce->val4 >= 0) { map_freeblock_lock(); dounlock = true; - status_fix_damage(bl, bl, 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0); + status_fix_damage(bl, bl, 100, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0); unit_skillcastcancel(bl, 2); } break; @@ -14142,7 +14142,7 @@ TIMER_FUNC(status_change_timer){ int64 damage = status->vit * (sce->val1 - 3) + (int)status->max_hp / 100; // {Target VIT x (New Poison Research Skill Level - 3)} + (Target HP/100) map_freeblock_lock(); dounlock = true; - status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0); + status_fix_damage(bl, bl, damage, clif_damage(*bl, *bl, tick, status->amotion, status->dmotion + 500, damage, 1, DMG_NORMAL, 0, false),0); unit_skillcastcancel(bl, 2); } break; @@ -14669,7 +14669,7 @@ TIMER_FUNC(status_change_timer){ int damage = sce->val2; map_freeblock_lock(); - clif_damage(bl, bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false); + clif_damage(*bl, *bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false); status_damage(src, bl, damage,0, 0, 1, 0); if( sc->getSCE(type) ) { sc_timer_next(2000 + tick); @@ -14691,7 +14691,7 @@ TIMER_FUNC(status_change_timer){ if( sd && !pc_issit(sd) ) { // Force to sit every 10 seconds. pc_setsit(sd); skill_sit(sd, true); - clif_sitting(bl); + clif_sitting(*bl); } sc_timer_next(10000 + tick); return 0; diff --git a/src/map/vending.cpp b/src/map/vending.cpp index eb8fbedb5c..c6de5e4b6a 100755 --- a/src/map/vending.cpp +++ b/src/map/vending.cpp @@ -566,7 +566,7 @@ void vending_reopen( map_session_data& sd ) if( at->sit ) { pc_setsit(&sd); skill_sit(&sd, 1); - clif_sitting(&sd.bl); + clif_sitting(sd.bl); } // Immediate save