summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2018-11-06 04:15:56 +0300
committerAndrei Karas <akaras@inbox.ru>2018-11-14 06:00:50 +0300
commit172f8c8ac189e1f6590324eb0aca14cffdba3083 (patch)
tree28145c62104455d9ab69c2f8f3b75e8d206a1bf8
parent27fb22d9f492cffe206594e5af0f854cf8fa3ce5 (diff)
downloadhercules-172f8c8ac189e1f6590324eb0aca14cffdba3083.tar.gz
hercules-172f8c8ac189e1f6590324eb0aca14cffdba3083.tar.bz2
hercules-172f8c8ac189e1f6590324eb0aca14cffdba3083.tar.xz
hercules-172f8c8ac189e1f6590324eb0aca14cffdba3083.zip
Add compile time validation for packet ZC_ITEM_PREVIEW.
-rw-r--r--src/common/packetsstatic_len.h33
-rw-r--r--src/map/HPMmap.c1
-rw-r--r--src/map/clif.c2
-rw-r--r--src/map/packets_struct.h45
4 files changed, 63 insertions, 18 deletions
diff --git a/src/common/packetsstatic_len.h b/src/common/packetsstatic_len.h
new file mode 100644
index 000000000..9ccc4a673
--- /dev/null
+++ b/src/common/packetsstatic_len.h
@@ -0,0 +1,33 @@
+/**
+ * This file is part of Hercules.
+ * http://herc.ws - http://github.com/HerculesWS/Hercules
+ *
+ * Copyright (C) 2013-2018 Hercules Dev Team
+ *
+ * Hercules is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef COMMON_PACKETSSTATIC_LEN_H
+#define COMMON_PACKETSSTATIC_LEN_H
+
+#ifdef packetLen
+#error packetLen already defined
+#endif
+
+#define packetLen(id, len) PACKET_LEN_##id = (len),
+enum packet_lengths {
+#include "common/packets_len.h"
+};
+#undef packetLen
+
+#endif /* COMMON_PACKETSSTATIC_LEN_H */
diff --git a/src/map/HPMmap.c b/src/map/HPMmap.c
index 8ea524d23..6eff37df8 100644
--- a/src/map/HPMmap.c
+++ b/src/map/HPMmap.c
@@ -74,7 +74,6 @@
#include "map/mercenary.h"
#include "map/mob.h"
#include "map/npc.h"
-#include "map/packets_struct.h"
#include "map/party.h"
#include "map/path.h"
#include "map/pc.h"
diff --git a/src/map/clif.c b/src/map/clif.c
index d4c378f27..9f1038d2c 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -21971,7 +21971,7 @@ static void clif_item_preview(struct map_session_data *sd, int n)
Assert_retv(n >= 0 && n < MAX_INVENTORY);
struct PACKET_ZC_ITEM_PREVIEW p;
- p.packetType = itemPreview;
+ p.packetType = HEADER_ZC_ITEM_PREVIEW;
p.index = n + 2;
#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024
p.isDamaged = (sd->status.inventory[n].attribute & ATTR_BROKEN) != 0 ? 1 : 0;
diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h
index 5d097104e..cd3a3b989 100644
--- a/src/map/packets_struct.h
+++ b/src/map/packets_struct.h
@@ -25,10 +25,15 @@
#include "common/cbasetypes.h"
#include "common/mmo.h"
+#include "common/packetsstatic_len.h"
// Packet DB
#define MAX_PACKET_POS 20
+#define DEFINE_PACKET_HEADER(name, id) \
+ STATIC_ASSERT(sizeof(struct PACKET_##name) == PACKET_LEN_##id, "Wrong size PACKET_"#name); \
+ enum { HEADER_##name = id };
+
/**
*
**/
@@ -449,11 +454,6 @@ enum packet_headers {
#else
guildLeave = 0x15a,
#endif
-#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024
- itemPreview = 0xb13,
-#else
- itemPreview = 0xab9,
-#endif
#if PACKETVER_RE_NUM >= 20181031
autoSpellList = 0xafb,
#else
@@ -2882,17 +2882,6 @@ struct PACKET_ZC_CAMERA_INFO {
float latitude;
} __attribute__((packed));
-struct PACKET_ZC_ITEM_PREVIEW {
- int16 packetType;
- int16 index;
-#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024
- int8 isDamaged;
-#endif
- int16 refiningLevel;
- struct EQUIPSLOTINFO slot;
- struct ItemOptions option_data[MAX_ITEM_OPTIONS];
-} __attribute__((packed));
-
#if PACKETVER_RE_NUM >= 20181031
#define PACKET_ZC_AUTOSPELLLIST PACKET_ZC_AUTOSPELLLIST2
#else
@@ -2910,6 +2899,30 @@ struct PACKET_ZC_AUTOSPELLLIST2 {
int skills[];
} __attribute__((packed));
+#if PACKETVER_MAIN_NUM >= 20170726 || PACKETVER_RE_NUM >= 20170621 || defined(PACKETVER_ZERO)
+#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024
+struct PACKET_ZC_ITEM_PREVIEW {
+ int16 packetType;
+ int16 index;
+ int8 isDamaged;
+ int16 refiningLevel;
+ struct EQUIPSLOTINFO slot;
+ struct ItemOptions option_data[MAX_ITEM_OPTIONS];
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_ITEM_PREVIEW, 0x0b13);
+#else // PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024
+
+struct PACKET_ZC_ITEM_PREVIEW {
+ int16 packetType;
+ int16 index;
+ int16 refiningLevel;
+ struct EQUIPSLOTINFO slot;
+ struct ItemOptions option_data[MAX_ITEM_OPTIONS];
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_ITEM_PREVIEW, 0x0ab9);
+#endif // PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024
+#endif // PACKETVER_MAIN_NUM >= 20170726 || PACKETVER_RE_NUM >= 20170621 || defined(PACKETVER_ZERO)
+
#if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
#pragma pack(pop)
#endif // not NetBSD < 6 / Solaris