summaryrefslogtreecommitdiff
path: root/src/emap/send.c
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-04 22:37:51 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-04 22:37:51 +0300
commit58b8c8d8cb9f78537495f908887fea9d0a451637 (patch)
tree74438cc91f5c5a6a7a953c98aa52106eb88b250f /src/emap/send.c
parent857c86d93ebd68e5edbbe14ce26a16a967622822 (diff)
downloadplugin-58b8c8d8cb9f78537495f908887fea9d0a451637.tar.gz
plugin-58b8c8d8cb9f78537495f908887fea9d0a451637.tar.bz2
plugin-58b8c8d8cb9f78537495f908887fea9d0a451637.tar.xz
plugin-58b8c8d8cb9f78537495f908887fea9d0a451637.zip
Rename login/char/map dirs to elogin/echar/emap for avoid conflicts with hercules.
Diffstat (limited to 'src/emap/send.c')
-rw-r--r--src/emap/send.c305
1 files changed, 305 insertions, 0 deletions
diff --git a/src/emap/send.c b/src/emap/send.c
new file mode 100644
index 0000000..6f3f257
--- /dev/null
+++ b/src/emap/send.c
@@ -0,0 +1,305 @@
+// Copyright (c) Copyright (c) Hercules Dev Team, licensed under GNU GPL.
+// Copyright (c) 2014 Evol developers
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "common/HPMi.h"
+#include "common/malloc.h"
+#include "common/mmo.h"
+#include "common/socket.h"
+#include "common/strlib.h"
+#include "map/clif.h"
+#include "map/mob.h"
+#include "map/npc.h"
+#include "map/pc.h"
+#include "map/pet.h"
+#include "map/unit.h"
+
+#include "emap/send.h"
+#include "emap/permission.h"
+#include "emap/data/session.h"
+#include "emap/struct/sessionext.h"
+
+void send_npccommand (TBL_PC *sd, int npcId, int cmd)
+{
+ if (!sd)
+ return;
+
+ int fd = sd->fd;
+ WFIFOHEAD (fd, 16);
+ WFIFOW (fd, 0) = 0xB00;
+ WFIFOL (fd, 2) = npcId;
+ WFIFOW (fd, 6) = cmd;
+ WFIFOL (fd, 8) = 0;
+ WFIFOW (fd, 12) = 0;
+ WFIFOW (fd, 14) = 0;
+ WFIFOSET (fd, 16);
+}
+
+// 0 - get client lang
+void send_npccommand2 (TBL_PC *sd, int npcId, int cmd, int id, int x, int y)
+{
+ if (!sd)
+ return;
+
+ int fd = sd->fd;
+ WFIFOHEAD (fd, 16);
+ WFIFOW (fd, 0) = 0xB00;
+ WFIFOL (fd, 2) = npcId;
+ WFIFOW (fd, 6) = cmd;
+ WFIFOL (fd, 8) = id;
+ WFIFOW (fd, 12) = x;
+ WFIFOW (fd, 14) = y;
+ WFIFOSET (fd, 16);
+}
+
+void send_local_message(int fd, struct block_list* bl, const char* msg)
+{
+ if (!msg || !bl)
+ return;
+ unsigned short msg_len = strlen(msg) + 1;
+ uint8 buf[256];
+
+ int len = sizeof(buf) - 8;
+ if (msg_len > len)
+ {
+ ShowWarning("clif_message: Truncating too long message '%s' (len=%u).\n", msg, msg_len);
+ msg_len = len;
+ }
+
+ WFIFOHEAD (fd, msg_len + 8);
+ WFIFOW (fd, 0) = 0x8d;
+ WFIFOW (fd, 2) = msg_len + 8;
+ WFIFOL (fd, 4) = bl->id;
+ safestrncpy((char*)WFIFOP(fd, 8), msg, msg_len);
+ WFIFOSET (fd, msg_len + 8);
+}
+
+void send_changelook(int fd, int id, int type, int val)
+{
+ WFIFOHEAD (fd, 11);
+ WFIFOW (fd, 0) = 0x1d7;
+ WFIFOL (fd, 2) = id;
+ WFIFOB (fd, 6) = type;
+ WFIFOW (fd, 7) = val;
+ WFIFOW (fd, 9) = 0;
+ WFIFOSET (fd, 11);
+}
+
+void send_mapmask(int fd, int mask)
+{
+ WFIFOHEAD (fd, 10);
+ WFIFOW (fd, 0) = 0xb02;
+ WFIFOL (fd, 2) = mask;
+ WFIFOL (fd, 6) = 0;
+ WFIFOSET (fd, 10);
+}
+
+void send_mapmask_brodcast(const int map, const int mask)
+{
+ struct block_list bl;
+ char buf[10];
+
+ bl.m = map;
+ WBUFW (buf, 0) = 0xb02;
+ WBUFL (buf, 2) = mask;
+ WBUFL (buf, 6) = 0;
+ clif->send(buf, 10, &bl, ALL_SAMEMAP);
+}
+
+void send_mob_info(struct block_list* bl1, struct block_list* bl2,
+ enum send_target target)
+{
+ if (!bl1 || bl1->type != BL_MOB)
+ return;
+
+ char buf[12];
+ TBL_MOB *md = (TBL_MOB *)bl1;
+
+ WBUFW (buf, 0) = 0xb03;
+ WBUFW (buf, 2) = 12; // len
+ WBUFL (buf, 4) = md->bl.id;
+ WBUFL (buf, 8) = md->status.rhw.range;
+
+ clif->send(&buf, sizeof(buf), bl2, target);
+}
+
+void send_pc_info(struct block_list* bl1,
+ struct block_list* bl2,
+ enum send_target target)
+{
+ if (!bl1 || bl1->type != BL_PC)
+ return;
+
+ char buf[12];
+ TBL_PC *sd = (TBL_PC *)bl1;
+ struct SessionExt *data = session_get_bysd(sd);
+ if (!data)
+ return;
+
+ TBL_PC *tsd = (TBL_PC *)bl2;
+ if (tsd)
+ {
+ struct SessionExt *tdata = session_get_bysd(tsd);
+ if (!tdata || tdata->clientVersion < 4)
+ return;
+ }
+
+ WBUFW (buf, 0) = 0xb0a;
+ WBUFW (buf, 2) = 12; // len
+ WBUFL (buf, 4) = sd->bl.id;
+ if (pc_has_permission(sd, permission_send_gm_flag))
+ WBUFL (buf, 8) = sd->group_id;
+ else
+ WBUFL (buf, 8) = 0;
+
+ clif->send(&buf, sizeof(buf), bl2, target);
+}
+
+void send_npc_info(struct block_list* bl1,
+ struct block_list* bl2,
+ enum send_target target)
+{
+ if (!bl1 || bl1->type != BL_NPC)
+ return;
+
+ TBL_PC *tsd = (TBL_PC *)bl2;
+ if (tsd)
+ {
+ struct SessionExt *tdata = session_get_bysd(tsd);
+ if (!tdata || tdata->clientVersion < 5)
+ return;
+ }
+
+ TBL_NPC *const nd = (TBL_NPC*)bl1;
+
+ char buf[12];
+ WBUFW (buf, 0) = 0xb0b;
+ WBUFW (buf, 2) = 12; // len
+ WBUFL (buf, 4) = nd->bl.id;
+ WBUFL (buf, 8) = nd->area_size;
+
+ clif->send(&buf, sizeof(buf), bl2, target);
+}
+
+void send_advmoving(struct unit_data* ud, struct block_list *tbl, enum send_target target)
+{
+ if (!ud)
+ return;
+
+ struct block_list *bl = ud->bl;
+
+ if (ud->walkpath.path_len <= ud->walkpath.path_pos)
+ return;
+ const bool haveMoves = (ud->walkpath.path_len > ud->walkpath.path_pos);
+
+ int i = 14;
+ const int len = ud->walkpath.path_len - ud->walkpath.path_pos;
+ if (haveMoves)
+ i += len;
+
+ char *buf;
+ CREATE(buf, char, i);
+ WBUFW (buf, 0) = 0xb04;
+ WBUFW (buf, 2) = i;
+ WBUFL (buf, 4) = bl->id;
+ WBUFW (buf, 8) = status->get_speed(bl);
+ WBUFW (buf, 10) = bl->x;
+ WBUFW (buf, 12) = bl->y;
+ if (haveMoves)
+ memcpy(buf + 14, ud->walkpath.path + ud->walkpath.path_pos, len);
+ clif->send(buf, i, tbl, target);
+ aFree(buf);
+}
+
+void send_changemusic_brodcast(const int map, const char *music)
+{
+ if (!music)
+ return;
+
+ struct block_list bl;
+ const int sz = strlen (music) + 5;
+ char *buf;
+
+ CREATE(buf, char, sz);
+ bl.m = map;
+ WBUFW (buf, 0) = 0xb05;
+ WBUFW (buf, 2) = sz;
+ strcpy ((char *)WBUFP (buf, 4), music);
+ clif->send (buf, sz, &bl, ALL_SAMEMAP);
+ aFree(buf);
+}
+
+void send_changenpc_title (TBL_PC *sd, const int npcId, const char *name)
+{
+ if (!sd || !name)
+ return;
+
+ const int fd = sd->fd;
+ const int len = strlen (name);
+ const int sz = len + 5 + 4 + 2;
+ WFIFOHEAD (fd, sz);
+ WFIFOW (fd, 0) = 0xb06;
+ WFIFOW (fd, 2) = sz;
+ WFIFOL (fd, 4) = npcId;
+ WFIFOW (fd, 8) = len;
+ strcpy ((char*)WFIFOP (fd, 10), name);
+ WFIFOSET (fd, sz);
+}
+
+void send_join_ack(int fd, const char *const name, int flag)
+{
+ if (!name)
+ return;
+
+ WFIFOHEAD (fd, 27);
+ WFIFOW (fd, 0) = 0xb08;
+ safestrncpy ((char*)WFIFOP (fd, 2), name, 24);
+ WFIFOB (fd, 26) = flag;
+ WFIFOSET (fd, 27);
+}
+
+void send_slave_say(TBL_PC *sd,
+ struct block_list *bl,
+ const char *const name,
+ const char *const message)
+{
+ const int len = 24 + 7 + strlen(message);
+ char *buf = NULL;
+ CREATE(buf, char, len);
+
+ snprintf(buf, len, "%s's %s : %s", sd->status.name, name, message);
+ buf[len - 1] = 0;
+ clif->GlobalMessage(bl, buf);
+ aFree(buf);
+}
+
+void send_online_list(int fd, const char *buf, unsigned size)
+{
+ if (!buf)
+ return;
+ const unsigned int len = size + 4 + 1;
+ WFIFOHEAD (fd, len);
+ WFIFOW (fd, 0) = 0xb10;
+ WFIFOW (fd, 2) = len;
+ memcpy (WFIFOP (fd, 4), buf, size);
+ WFIFOB (fd, size + 4) = 0;
+ WFIFOSET (fd, len);
+}
+
+void send_client_command(TBL_PC *sd, const char *const command)
+{
+ struct SessionExt *data = session_get_bysd(sd);
+ if (!data || data->clientVersion < 8)
+ return;
+
+ const unsigned int len = strlen(command);
+ const int fd = sd->fd;
+ WFIFOHEAD (fd, len);
+ WFIFOW (fd, 0) = 0xb16;
+ WFIFOW (fd, 2) = len + 4;
+ memcpy (WFIFOP (fd, 4), command, len);
+ WFIFOSET (fd, len + 4);
+}