From d730fff10b64381cb6676b13c7b8ace459b2184d Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 21 Jul 2016 21:52:09 +0300 Subject: Add fail move response packet. --- src/emap/clif.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/emap/clif.h | 3 ++- src/emap/init.c | 1 + src/emap/send.c | 11 ++++++++ src/emap/send.h | 3 +++ 5 files changed, 97 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/emap/clif.c b/src/emap/clif.c index 2faf394..d211a83 100644 --- a/src/emap/clif.c +++ b/src/emap/clif.c @@ -14,7 +14,6 @@ #include "common/socket.h" #include "common/strlib.h" #include "common/cbasetypes.h" -//#include "common/utils.h" #include "common/random.h" #include "common/timer.h" #include "map/guild.h" @@ -39,6 +38,39 @@ extern bool isInit; +static inline void RBUFPOS(const uint8 *p, + unsigned short pos, + short *x, + short *y, + unsigned char *dir) +{ + p += pos; + + if (x) + { + x[0] = ((p[0] & 0xff) << 2) | (p[1] >> 6); + } + + if (y) + { + y[0] = ((p[1] & 0x3f) << 4) | (p[2] >> 4); + } + + if (dir) + { + dir[0] = (p[2] & 0x0f); + } +} + +static inline void RFIFOPOS(int fd, + unsigned short pos, + short *x, + short *y, + unsigned char *dir) +{ + RBUFPOS(RFIFOP(fd,pos), 0, x, y, dir); +} + void eclif_quest_send_list_pre(TBL_PC **sdPtr) { TBL_PC *sd = *sdPtr; @@ -1651,3 +1683,50 @@ void eclif_skillinfo_pre(struct map_session_data **sdPtr, WFIFOB(fd, 20) = 0; WFIFOSET(fd, sz); } + +void eclif_parse_WalkToXY(int fd, + struct map_session_data *sd) +{ + short x, y; + + if (pc_isdead(sd)) + { + clif->clearunit_area(&sd->bl, CLR_DEAD); + return; + } + + if (sd->sc.opt1 && (sd->sc.opt1 == OPT1_STONEWAIT || sd->sc.opt1 == OPT1_BURNING)) + ; //You CAN walk on this OPT1 value. + /*else if( sd->progressbar.npc_id ) + clif->progressbar_abort(sd);*/ + else if (pc_cant_act(sd)) + return; + + if(sd->sc.data[SC_RUN] || sd->sc.data[SC_WUGDASH]) + return; + + pc->delinvincibletimer(sd); + + RFIFOPOS(fd, 2, &x, &y, NULL); + + //Set last idle time... [Skotlex] + pc->update_idle_time(sd, BCIDLE_WALK); + + if (sd->ud.state.change_walk_target == 0) + { + if (unit->walktoxy(&sd->bl, x, y, 4) && + sd->ud.state.change_walk_target == 1) + { + struct SessionExt *data = session_get_bysd(sd); + if (!data) + return; + if (data->clientVersion < 18) + return; + send_walk_fail(sd->fd, x, y); + } + } + else + { + unit->walktoxy(&sd->bl, x, y, 4); + } +} diff --git a/src/emap/clif.h b/src/emap/clif.h index 9605e7c..5786e52 100644 --- a/src/emap/clif.h +++ b/src/emap/clif.h @@ -99,5 +99,6 @@ void eclif_addskill_pre(struct map_session_data **sdPtr, void eclif_skillinfo_pre(struct map_session_data **sdPtr, int *skill_idPtr, int *infPtr); - +void eclif_parse_WalkToXY(int fd, + struct map_session_data *sd) __attribute__((nonnull (2))); #endif // EVOL_MAP_CLIF diff --git a/src/emap/init.c b/src/emap/init.c index 9a1234b..4ac951d 100644 --- a/src/emap/init.c +++ b/src/emap/init.c @@ -312,6 +312,7 @@ HPExport void plugin_init (void) skill->castend_pos2_unknown = eskill_castend_pos2_unknown; skill->validate_additional_fields = eskill_validate_additional_fields; clif->useskill = eclif_useskill; + clif->pWalkToXY = eclif_parse_WalkToXY; langScriptId = script->add_str("Lang"); mountScriptId = script->add_str("mount"); diff --git a/src/emap/send.c b/src/emap/send.c index 36e05e9..2d22363 100644 --- a/src/emap/send.c +++ b/src/emap/send.c @@ -12,6 +12,7 @@ #include "common/mmo.h" #include "common/socket.h" #include "common/strlib.h" +#include "common/timer.h" #include "map/clif.h" #include "map/mob.h" #include "map/npc.h" @@ -482,3 +483,13 @@ void send_pc_killed(int fd, struct block_list* bl) WFIFOL(fd, 2) = 0; WFIFOSET(fd, 6); } + +void send_walk_fail(int fd, int x, int y) +{ + WFIFOHEAD(fd, 10); + WFIFOW(fd,0) = 0xb21; + WFIFOL(fd, 2) = (unsigned int)timer->gettick(); + WFIFOW(fd, 6) = x; + WFIFOW(fd, 8) = y; + WFIFOSET(fd, 10); +} diff --git a/src/emap/send.h b/src/emap/send.h index 8ebb7d1..d2d6397 100644 --- a/src/emap/send.h +++ b/src/emap/send.h @@ -50,5 +50,8 @@ void send_pc_skin(int fd, const char *const skin); void send_pc_killed(int fd, struct block_list* bl); +void send_walk_fail(int fd, + int x, + int y); #endif // EVOL_MAP_SEND -- cgit v1.2.3-60-g2f50