summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/HPMDataCheck.h37
-rw-r--r--src/common/HPMSymbols.inc.h14
-rw-r--r--src/common/cbasetypes.h7
-rw-r--r--src/common/mmo.h62
-rw-r--r--src/common/utils.c22
-rw-r--r--src/common/utils.h1
6 files changed, 138 insertions, 5 deletions
diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h
index 2a1c092b7..7480269e5 100644
--- a/src/common/HPMDataCheck.h
+++ b/src/common/HPMDataCheck.h
@@ -101,6 +101,11 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
#else
#define CHAR_INT_QUEST_H
#endif // CHAR_INT_QUEST_H
+ #ifdef CHAR_INT_RODEX_H
+ { "inter_rodex_interface", sizeof(struct inter_rodex_interface), SERVER_TYPE_CHAR },
+ #else
+ #define CHAR_INT_RODEX_H
+ #endif // CHAR_INT_RODEX_H
#ifdef CHAR_INT_STORAGE_H
{ "inter_storage_interface", sizeof(struct inter_storage_interface), SERVER_TYPE_CHAR },
#else
@@ -207,6 +212,8 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "party_member", sizeof(struct party_member), SERVER_TYPE_ALL },
{ "point", sizeof(struct point), SERVER_TYPE_ALL },
{ "quest", sizeof(struct quest), SERVER_TYPE_ALL },
+ { "rodex_maillist", sizeof(struct rodex_maillist), SERVER_TYPE_ALL },
+ { "rodex_message", sizeof(struct rodex_message), SERVER_TYPE_ALL },
{ "s_elemental", sizeof(struct s_elemental), SERVER_TYPE_ALL },
{ "s_friend", sizeof(struct s_friend), SERVER_TYPE_ALL },
{ "s_homunculus", sizeof(struct s_homunculus), SERVER_TYPE_ALL },
@@ -545,6 +552,31 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "EQUIPSLOTINFO", sizeof(struct EQUIPSLOTINFO), SERVER_TYPE_MAP },
{ "ItemOptions", sizeof(struct ItemOptions), SERVER_TYPE_MAP },
{ "NORMALITEM_INFO", sizeof(struct NORMALITEM_INFO), SERVER_TYPE_MAP },
+ { "PACKET_CZ_ADD_ITEM_TO_MAIL", sizeof(struct PACKET_CZ_ADD_ITEM_TO_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_CZ_CHECKNAME", sizeof(struct PACKET_CZ_CHECKNAME), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_DELETE_MAIL", sizeof(struct PACKET_CZ_REQ_DELETE_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_ITEM_FROM_MAIL", sizeof(struct PACKET_CZ_REQ_ITEM_FROM_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_NEXT_MAIL_LIST", sizeof(struct PACKET_CZ_REQ_NEXT_MAIL_LIST), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_OPEN_MAIL", sizeof(struct PACKET_CZ_REQ_OPEN_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_OPEN_WRITE_MAIL", sizeof(struct PACKET_CZ_REQ_OPEN_WRITE_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_READ_MAIL", sizeof(struct PACKET_CZ_REQ_READ_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_REFRESH_MAIL_LIST", sizeof(struct PACKET_CZ_REQ_REFRESH_MAIL_LIST), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_REMOVE_ITEM_MAIL", sizeof(struct PACKET_CZ_REQ_REMOVE_ITEM_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_CZ_REQ_ZENY_FROM_MAIL", sizeof(struct PACKET_CZ_REQ_ZENY_FROM_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_CZ_SEND_MAIL", sizeof(struct PACKET_CZ_SEND_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_ACK_DELETE_MAIL", sizeof(struct PACKET_ZC_ACK_DELETE_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_ACK_ITEM_FROM_MAIL", sizeof(struct PACKET_ZC_ACK_ITEM_FROM_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_ACK_OPEN_WRITE_MAIL", sizeof(struct PACKET_ZC_ACK_OPEN_WRITE_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_ACK_REMOVE_ITEM_MAIL", sizeof(struct PACKET_ZC_ACK_REMOVE_ITEM_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_ACK_ZENY_FROM_MAIL", sizeof(struct PACKET_ZC_ACK_ZENY_FROM_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_ADD_ITEM_TO_MAIL", sizeof(struct PACKET_ZC_ADD_ITEM_TO_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_CHECKNAME", sizeof(struct PACKET_ZC_CHECKNAME), SERVER_TYPE_MAP },
+ { "PACKET_ZC_MAIL_LIST", sizeof(struct PACKET_ZC_MAIL_LIST), SERVER_TYPE_MAP },
+ { "PACKET_ZC_NOTIFY_UNREADMAIL", sizeof(struct PACKET_ZC_NOTIFY_UNREADMAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_READ_MAIL", sizeof(struct PACKET_ZC_READ_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_WRITE_MAIL_RESULT", sizeof(struct PACKET_ZC_WRITE_MAIL_RESULT), SERVER_TYPE_MAP },
+ { "mail_item", sizeof(struct mail_item), SERVER_TYPE_MAP },
+ { "maillistinfo", sizeof(struct maillistinfo), SERVER_TYPE_MAP },
{ "packet_additem", sizeof(struct packet_additem), SERVER_TYPE_MAP },
{ "packet_authok", sizeof(struct packet_authok), SERVER_TYPE_MAP },
{ "packet_banking_check", sizeof(struct packet_banking_check), SERVER_TYPE_MAP },
@@ -672,6 +704,11 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
#else
#define MAP_QUEST_H
#endif // MAP_QUEST_H
+ #ifdef MAP_RODEX_H
+ { "rodex_interface", sizeof(struct rodex_interface), SERVER_TYPE_MAP },
+ #else
+ #define MAP_RODEX_H
+ #endif // MAP_RODEX_H
#ifdef MAP_SCRIPT_H
{ "Script_Config", sizeof(struct Script_Config), SERVER_TYPE_MAP },
{ "casecheck_data", sizeof(struct casecheck_data), SERVER_TYPE_MAP },
diff --git a/src/common/HPMSymbols.inc.h b/src/common/HPMSymbols.inc.h
index 30ec45405..5ee8a014b 100644
--- a/src/common/HPMSymbols.inc.h
+++ b/src/common/HPMSymbols.inc.h
@@ -125,6 +125,9 @@ struct inter_pet_interface *inter_pet;
#ifdef CHAR_INT_QUEST_H /* inter_quest */
struct inter_quest_interface *inter_quest;
#endif // CHAR_INT_QUEST_H
+#ifdef CHAR_INT_RODEX_H /* inter_rodex */
+struct inter_rodex_interface *inter_rodex;
+#endif // CHAR_INT_RODEX_H
#ifdef CHAR_INT_STORAGE_H /* inter_storage */
struct inter_storage_interface *inter_storage;
#endif // CHAR_INT_STORAGE_H
@@ -218,6 +221,9 @@ struct quest_interface *quest;
#ifdef COMMON_RANDOM_H /* rnd */
struct rnd_interface *rnd;
#endif // COMMON_RANDOM_H
+#ifdef MAP_RODEX_H /* rodex */
+struct rodex_interface *rodex;
+#endif // MAP_RODEX_H
#ifdef MAP_SCRIPT_H /* script */
struct script_interface *script;
#endif // MAP_SCRIPT_H
@@ -405,6 +411,10 @@ HPExport const char *HPM_shared_symbols(int server_type)
if ((server_type&(SERVER_TYPE_CHAR)) != 0 && !HPM_SYMBOL("inter_quest", inter_quest))
return "inter_quest";
#endif // CHAR_INT_QUEST_H
+#ifdef CHAR_INT_RODEX_H /* inter_rodex */
+ if ((server_type&(SERVER_TYPE_CHAR)) != 0 && !HPM_SYMBOL("inter_rodex", inter_rodex))
+ return "inter_rodex";
+#endif // CHAR_INT_RODEX_H
#ifdef CHAR_INT_STORAGE_H /* inter_storage */
if ((server_type&(SERVER_TYPE_CHAR)) != 0 && !HPM_SYMBOL("inter_storage", inter_storage))
return "inter_storage";
@@ -529,6 +539,10 @@ HPExport const char *HPM_shared_symbols(int server_type)
if ((server_type&(SERVER_TYPE_ALL)) != 0 && !HPM_SYMBOL("rnd", rnd))
return "rnd";
#endif // COMMON_RANDOM_H
+#ifdef MAP_RODEX_H /* rodex */
+ if ((server_type&(SERVER_TYPE_MAP)) != 0 && !HPM_SYMBOL("rodex", rodex))
+ return "rodex";
+#endif // MAP_RODEX_H
#ifdef MAP_SCRIPT_H /* script */
if ((server_type&(SERVER_TYPE_MAP)) != 0 && !HPM_SYMBOL("script", script))
return "script";
diff --git a/src/common/cbasetypes.h b/src/common/cbasetypes.h
index 2c36c23bc..5be2d62e4 100644
--- a/src/common/cbasetypes.h
+++ b/src/common/cbasetypes.h
@@ -306,6 +306,13 @@ typedef uintptr_t uintptr;
#define PRAGMA_GCC46(str)
#endif // ! defined(__GNUC__) && (defined(__clang__) || GCC_VERSION >= 40600)
+// Pragma macro only enabled on gcc >= 5 or clang - borrowed from Mana Plus
+#if defined(__GNUC__) && (GCC_VERSION >= 50000)
+#define PRAGMA_GCC5(str) _Pragma(#str)
+#else // ! defined(__GNUC__) && (GCC_VERSION >= 50000)
+#define PRAGMA_GCC5(str)
+#endif // ! defined(__GNUC__) && (GCC_VERSION >= 50000)
+
// fallthrough attribute only enabled on gcc >= 7.0
#if defined(__GNUC__) && (GCC_VERSION >= 70000)
#define FALLTHROUGH __attribute__ ((fallthrough));
diff --git a/src/common/mmo.h b/src/common/mmo.h
index 276e0eb08..fe67d6efb 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -271,6 +271,13 @@
#endif
STATIC_ASSERT(MAX_ITEM_OPTIONS <= 5, "This value is limited by the client and database layout and should only be increased if you know the consequences.");
+// RoDEX
+#define RODEX_TITLE_LENGTH (40 + 1)
+#define RODEX_BODY_LENGTH (500 + 1)
+#define RODEX_MAX_ITEM (5)
+#define RODEX_EXPIRE (1 * 15 * 24 * 60 * 60)
+#define RODEX_MAIL_PER_PAGE 7
+
// The following system marks a different job ID system used by the map server,
// which makes a lot more sense than the normal one. [Skotlex]
// These marks the "level" of the job.
@@ -586,7 +593,7 @@ struct mmo_charstatus {
int mother;
int child;
- unsigned int base_exp,job_exp;
+ uint64 base_exp, job_exp;
int zeny;
int bank_vault;
@@ -605,10 +612,14 @@ struct mmo_charstatus {
int spear_faith, spear_calls;
int sword_faith, sword_calls;
- short weapon; // enum weapon_type
- short shield; // view-id
- short head_top,head_mid,head_bottom;
- short robe;
+ struct {
+ short weapon; ///< Weapon view sprite id.
+ short shield; ///< Shield view sprite id.
+ short head_top; ///< Top headgear view sprite id.
+ short head_mid; ///< Middle headgear view sprite id.
+ short head_bottom; ///< Bottom headgear view sprite id.
+ short robe; ///< Robe view sprite id.
+ } look;
char name[NAME_LENGTH];
int base_level, job_level;
@@ -809,6 +820,46 @@ enum fame_list_type {
RANKTYPE_PK = 3, //Not supported yet
};
+struct rodex_message {
+ int64 id;
+ int sender_id;
+ char sender_name[NAME_LENGTH];
+ int receiver_id;
+ int receiver_accountid;
+ char receiver_name[NAME_LENGTH];
+ char title[RODEX_TITLE_LENGTH];
+ char body[RODEX_BODY_LENGTH];
+ struct {
+ struct item item;
+ int idx;
+
+ } items[RODEX_MAX_ITEM];
+ int64 zeny;
+ uint8 type;
+ int8 opentype;
+ bool is_read;
+ bool is_deleted;
+ int send_date;
+ int expire_date;
+ int weight;
+ int items_count;
+};
+
+VECTOR_STRUCT_DECL(rodex_maillist, struct rodex_message);
+
+enum rodex_opentype {
+ RODEX_OPENTYPE_MAIL = 0,
+ RODEX_OPENTYPE_ACCOUNT = 1,
+ RODEX_OPENTYPE_RETURN = 2,
+};
+
+enum MAIL_TYPE {
+ MAIL_TYPE_TEXT = 0x0,
+ MAIL_TYPE_ZENY = 0x2,
+ MAIL_TYPE_ITEM = 0x4,
+ MAIL_TYPE_NPC = 0x8
+};
+
/**
* Guild Basic Information
* It is used to request changes via intif_guild_change_basicinfo in map-server and to
@@ -1085,6 +1136,7 @@ enum ammo_type {
A_KUNAI, //7
A_CANNONBALL, //8
A_THROWWEAPON, //9
+ MAX_AMMO_TYPE
};
enum e_char_server_type {
diff --git a/src/common/utils.c b/src/common/utils.c
index bcfc153e3..0d76a885e 100644
--- a/src/common/utils.c
+++ b/src/common/utils.c
@@ -359,6 +359,28 @@ unsigned int get_percentage(const unsigned int A, const unsigned int B)
return (unsigned int)floor(result);
}
+/// calculates the value of A / B, in percent (rounded down)
+uint64 get_percentage64(const uint64 A, const uint64 B)
+{
+ double result;
+
+ if( B == 0 )
+ {
+ ShowError("get_percentage(): division by zero! (A=%"PRIu64",B=%"PRIu64")\n", A, B);
+ return ~0U;
+ }
+
+ result = 100 * ((double)A / (double)B);
+
+ if( result > UINT_MAX )
+ {
+ ShowError("get_percentage(): result percentage too high! (A=%"PRIu64",B=%"PRIu64",result=%g)\n", A, B, result);
+ return UINT_MAX;
+ }
+
+ return (uint64)floor(result);
+}
+
/**
* Applies a percentual rate modifier.
*
diff --git a/src/common/utils.h b/src/common/utils.h
index 9d3c323ef..e77c63cf2 100644
--- a/src/common/utils.h
+++ b/src/common/utils.h
@@ -44,6 +44,7 @@ bool exists(const char* filename);
/// calculates the value of A / B, in percent (rounded down)
unsigned int get_percentage(const unsigned int A, const unsigned int B);
+uint64 get_percentage64(const uint64 A, const uint64 B);
int64 apply_percentrate64(int64 value, int rate, int maxrate);
int apply_percentrate(int value, int rate, int maxrate);