summaryrefslogtreecommitdiff
path: root/src/char/inter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/char/inter.cpp')
-rw-r--r--src/char/inter.cpp535
1 files changed, 228 insertions, 307 deletions
diff --git a/src/char/inter.cpp b/src/char/inter.cpp
index 7752cb4..9efb28c 100644
--- a/src/char/inter.cpp
+++ b/src/char/inter.cpp
@@ -1,50 +1,50 @@
-// $Id: inter.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "../common/mmo.hpp"
-#include "char.hpp"
+#include "inter.hpp"
+
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
+
+#include <fstream>
+#include <vector>
+
+#include "../common/cxxstdio.hpp"
+#include "../common/db.hpp"
+#include "../common/extract.hpp"
+#include "../common/lock.hpp"
#include "../common/socket.hpp"
#include "../common/timer.hpp"
-#include "../common/db.hpp"
-#include <string.h>
-#include <stdlib.h>
+#include "../common/utils.hpp"
-#include "inter.hpp"
+#include "char.hpp"
#include "int_party.hpp"
-#include "int_guild.hpp"
#include "int_storage.hpp"
-#include "../common/lock.hpp"
-#define WISDATA_TTL (60*1000) // Existence time of Wisp/page data (60 seconds)
- // that is the waiting time of answers of all map-servers
-#define WISDELLIST_MAX 256 // Number of elements of Wisp/page data deletion list
+#include "../poison.hpp"
+
+// Existence time of Wisp/page data (60 seconds)
+// that is the waiting time of answers of all map-servers
+constexpr std::chrono::minutes WISDATA_TTL = std::chrono::minutes(1);
+// Number of elements of Wisp/page data deletion list
+constexpr int WISDELLIST_MAX = 256;
char inter_log_filename[1024] = "log/inter.log";
+static
char accreg_txt[1024] = "save/accreg.txt";
-static struct dbt *accreg_db = NULL;
struct accreg
{
- int account_id, reg_num;
+ int account_id, reg_num;
struct global_reg reg[ACCOUNT_REG_NUM];
};
+static
+Map<int, struct accreg> accreg_db;
-int party_share_level = 10;
-
-// 送信パケット長リスト
-int inter_send_packet_length[] = {
- -1, -1, 27, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -1, 7, 0, 0, 0, 0, 0, 0, -1, 11, 0, 0, 0, 0, 0, 0,
- 35, -1, 11, 15, 34, 29, 7, -1, 0, 0, 0, 0, 0, 0, 0, 0,
- 10, -1, 15, 0, 79, 19, 7, -1, 0, -1, -1, -1, 14, 67, 186, -1,
- 9, 9, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 11, -1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+int party_share_level = 10;
// 受信パケット長リスト
-int inter_recv_packet_length[] = {
+static
+int inter_recv_packet_length[] = {
-1, -1, 7, -1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6, -1, 0, 0, 0, 0, 0, 0, 10, -1, 0, 0, 0, 0, 0, 0,
72, 6, 52, 14, 10, 29, 6, -1, 34, 0, 0, 0, 0, 0, 0, 0,
@@ -58,122 +58,104 @@ int inter_recv_packet_length[] = {
struct WisData
{
- int id, fd, count, len;
- unsigned long tick;
- unsigned char src[24], dst[24], msg[1024];
+ int id, fd, count;
+ tick_t tick;
+ unsigned char src[24], dst[24];
+ std::string msg;
};
-static struct dbt *wis_db = NULL;
-static int wis_dellist[WISDELLIST_MAX], wis_delnum;
+static
+Map<int, struct WisData> wis_db;
+static
+int wis_dellist[WISDELLIST_MAX], wis_delnum;
//--------------------------------------------------------
// アカウント変数を文字列へ変換
static
-int inter_accreg_tostr (char *str, struct accreg *reg)
+std::string inter_accreg_tostr(struct accreg *reg)
{
- int j;
- char *p = str;
-
- p += sprintf (p, "%d\t", reg->account_id);
- for (j = 0; j < reg->reg_num; j++)
- {
- p += sprintf (p, "%s,%d ", reg->reg[j].str, reg->reg[j].value);
- }
-
- return 0;
+ std::string str STRPRINTF("%d\t", reg->account_id);
+ for (int j = 0; j < reg->reg_num; j++)
+ str += STRPRINTF("%s,%d ", reg->reg[j].str, reg->reg[j].value);
+ return str;
}
// アカウント変数を文字列から変換
static
-int inter_accreg_fromstr (const char *str, struct accreg *reg)
+bool extract(const_string str, struct accreg *reg)
{
- int j, v, n;
- char buf[128];
- const char *p = str;
-
- if (sscanf (p, "%d\t%n", &reg->account_id, &n) != 1
- || reg->account_id <= 0)
- return 1;
-
- for (j = 0, p += n; j < ACCOUNT_REG_NUM; j++, p += n)
- {
- if (sscanf (p, "%[^,],%d %n", buf, &v, &n) != 2)
- break;
- memcpy (reg->reg[j].str, buf, 32);
- reg->reg[j].value = v;
- }
- reg->reg_num = j;
-
- return 0;
+ std::vector<struct global_reg> vars;
+ if (!extract(str,
+ record<'\t'>(
+ &reg->account_id,
+ vrec<' '>(&vars))))
+ return false;
+ if (reg->account_id <= 0)
+ return false;
+
+ if (vars.size() > ACCOUNT_REG_NUM)
+ return false;
+ std::copy(vars.begin(), vars.end(), reg->reg);
+ reg->reg_num = vars.size();
+ return true;
}
// アカウント変数の読み込み
static
-int inter_accreg_init (void)
+int inter_accreg_init(void)
{
- char line[8192];
- FILE *fp;
- int c = 0;
- struct accreg *reg;
-
- accreg_db = numdb_init ();
+ int c = 0;
- if ((fp = fopen_ (accreg_txt, "r")) == NULL)
+ std::ifstream in(accreg_txt);
+ if (!in.is_open())
return 1;
- while (fgets (line, sizeof (line) - 1, fp))
+ std::string line;
+ while (std::getline(in, line))
{
- line[sizeof (line) - 1] = '\0';
- CREATE (reg, struct accreg, 1);
- if (inter_accreg_fromstr (line, reg) == 0 && reg->account_id > 0)
+ struct accreg reg {};
+ if (extract(line, &reg))
{
- numdb_insert (accreg_db, reg->account_id, reg);
+ accreg_db.insert(reg.account_id, reg);
}
else
{
- printf ("inter: accreg: broken data [%s] line %d\n", accreg_txt,
+ PRINTF("inter: accreg: broken data [%s] line %d\n", accreg_txt,
c);
- free (reg);
}
c++;
}
- fclose_ (fp);
-// printf("inter: %s read done (%d)\n", accreg_txt, c);
return 0;
}
// アカウント変数のセーブ用
static
-void inter_accreg_save_sub (db_key_t key, db_val_t data, va_list ap)
+void inter_accreg_save_sub(struct accreg *reg, FILE *fp)
{
- char line[8192];
- FILE *fp;
- struct accreg *reg = (struct accreg *) data;
-
if (reg->reg_num > 0)
{
- inter_accreg_tostr (line, reg);
- fp = va_arg (ap, FILE *);
- fprintf (fp, "%s\n", line);
+ std::string line = inter_accreg_tostr(reg);
+ fwrite(line.data(), 1, line.size(), fp);
+ fputc('\n', fp);
}
}
// アカウント変数のセーブ
static
-int inter_accreg_save (void)
+int inter_accreg_save(void)
{
FILE *fp;
- int lock;
+ int lock;
- if ((fp = lock_fopen (accreg_txt, &lock)) == NULL)
+ if ((fp = lock_fopen(accreg_txt, &lock)) == NULL)
{
- printf ("int_accreg: cant write [%s] !!! data is lost !!!\n",
+ PRINTF("int_accreg: cant write [%s] !!! data is lost !!!\n",
accreg_txt);
return 1;
}
- numdb_foreach (accreg_db, inter_accreg_save_sub, fp);
- lock_fclose (fp, accreg_txt, &lock);
-// printf("inter: %s saved.\n", accreg_txt);
+ for (auto& pair : accreg_db)
+ inter_accreg_save_sub(&pair.second, fp);
+ lock_fclose(fp, accreg_txt, &lock);
return 0;
}
@@ -185,119 +167,75 @@ int inter_accreg_save (void)
*------------------------------------------
*/
static
-int inter_config_read (const char *cfgName)
+int inter_config_read(const char *cfgName)
{
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp = fopen_ (cfgName, "r");
- if (fp == NULL)
+ std::ifstream in(cfgName);
+ if (!in.is_open())
{
- printf ("file not found: %s\n", cfgName);
+ PRINTF("file not found: %s\n", cfgName);
return 1;
}
- while (fgets (line, sizeof (line) - 1, fp))
- {
- if (line[0] == '/' && line[1] == '/')
- continue;
- line[sizeof (line) - 1] = '\0';
- if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2)
+ std::string line;
+ while (std::getline(in, line))
+ {
+ std::string w1, w2;
+ if (!split_key_value(line, &w1, &w2))
continue;
- if (strcasecmp (w1, "storage_txt") == 0)
+ if (w1 == "storage_txt")
{
- strncpy (storage_txt, w2, sizeof (storage_txt));
+ strzcpy(storage_txt, w2.c_str(), sizeof(storage_txt));
}
- else if (strcasecmp (w1, "party_txt") == 0)
+ else if (w1 == "party_txt")
{
- strncpy (party_txt, w2, sizeof (party_txt));
+ strzcpy(party_txt, w2.c_str(), sizeof(party_txt));
}
- else if (strcasecmp (w1, "guild_txt") == 0)
+ else if (w1 == "accreg_txt")
{
- strncpy (guild_txt, w2, sizeof (guild_txt));
+ strzcpy(accreg_txt, w2.c_str(), sizeof(accreg_txt));
}
- else if (strcasecmp (w1, "castle_txt") == 0)
+ else if (w1 == "party_share_level")
{
- strncpy (castle_txt, w2, sizeof (castle_txt));
- }
- else if (strcasecmp (w1, "accreg_txt") == 0)
- {
- strncpy (accreg_txt, w2, sizeof (accreg_txt));
- }
- else if (strcasecmp (w1, "guild_storage_txt") == 0)
- {
- strncpy (guild_storage_txt, w2, sizeof (guild_storage_txt));
- }
- else if (strcasecmp (w1, "party_share_level") == 0)
- {
- party_share_level = atoi (w2);
+ party_share_level = atoi(w2.c_str());
if (party_share_level < 0)
party_share_level = 0;
}
- else if (strcasecmp (w1, "inter_log_filename") == 0)
+ else if (w1 == "inter_log_filename")
{
- strncpy (inter_log_filename, w2, sizeof (inter_log_filename));
+ strzcpy(inter_log_filename, w2.c_str(), sizeof(inter_log_filename));
}
- else if (strcasecmp (w1, "import") == 0)
+ else if (w1 == "import")
{
- inter_config_read (w2);
+ inter_config_read(w2.c_str());
+ }
+ else
+ {
+ PRINTF("WARNING: unknown inter config key: %s\n", w1);
}
}
- fclose_ (fp);
-
- return 0;
-}
-
-// ログ書き出し
-int inter_log (const char *fmt, ...)
-{
- FILE *logfp;
- va_list ap;
-
- va_start (ap, fmt);
- logfp = fopen_ (inter_log_filename, "a");
- if (logfp)
- {
- vfprintf (logfp, fmt, ap);
- fclose_ (logfp);
- }
- va_end (ap);
return 0;
}
// セーブ
-int inter_save (void)
+int inter_save(void)
{
- inter_party_save ();
- inter_guild_save ();
- inter_storage_save ();
- inter_guild_storage_save ();
- inter_accreg_save ();
+ inter_party_save();
+ inter_storage_save();
+ inter_accreg_save();
return 0;
}
// 初期化
-int inter_init (const char *file)
+int inter_init(const char *file)
{
- inter_config_read (file);
-
- wis_db = numdb_init ();
-
- inter_party_init ();
- inter_guild_init ();
- inter_storage_init ();
- inter_accreg_init ();
-
- return 0;
-}
+ inter_config_read(file);
-// マップサーバー接続
-int inter_mapif_init (int fd)
-{
- inter_guild_mapif_init (fd);
+ inter_party_init();
+ inter_storage_init();
+ inter_accreg_init();
return 0;
}
@@ -307,87 +245,83 @@ int inter_mapif_init (int fd)
// GMメッセージ送信
static
-int mapif_GMmessage (unsigned char *mes, int len)
+void mapif_GMmessage(const uint8_t *mes, int len)
{
unsigned char buf[len];
- WBUFW (buf, 0) = 0x3800;
- WBUFW (buf, 2) = len;
- memcpy (WBUFP (buf, 4), mes, len - 4);
- mapif_sendall (buf, len);
-// printf("inter server: GM:%d %s\n", len, mes);
-
- return 0;
+ WBUFW(buf, 0) = 0x3800;
+ WBUFW(buf, 2) = len;
+ memcpy(WBUFP(buf, 4), mes, len - 4);
+ mapif_sendall(buf, len);
}
// Wisp/page transmission to all map-server
static
-int mapif_wis_message (struct WisData *wd)
+int mapif_wis_message(struct WisData *wd)
{
- unsigned char buf[56 + wd->len];
+ unsigned char buf[56 + wd->msg.size()];
- WBUFW (buf, 0) = 0x3801;
- WBUFW (buf, 2) = 56 + wd->len;
- WBUFL (buf, 4) = wd->id;
- memcpy (WBUFP (buf, 8), wd->src, 24);
- memcpy (WBUFP (buf, 32), wd->dst, 24);
- memcpy (WBUFP (buf, 56), wd->msg, wd->len);
- wd->count = mapif_sendall (buf, WBUFW (buf, 2));
+ WBUFW(buf, 0) = 0x3801;
+ WBUFW(buf, 2) = 56 + wd->msg.size();
+ WBUFL(buf, 4) = wd->id;
+ memcpy(WBUFP(buf, 8), wd->src, 24);
+ memcpy(WBUFP(buf, 32), wd->dst, 24);
+ memcpy(WBUFP(buf, 56), wd->msg.data(), wd->msg.size());
+ wd->count = mapif_sendall(buf, WBUFW(buf, 2));
return 0;
}
// Wisp/page transmission result to map-server
static
-int mapif_wis_end (struct WisData *wd, int flag)
+int mapif_wis_end(struct WisData *wd, int flag)
{
unsigned char buf[27];
- WBUFW (buf, 0) = 0x3802;
- memcpy (WBUFP (buf, 2), wd->src, 24);
- WBUFB (buf, 26) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send (wd->fd, buf, 27);
-// printf("inter server wis_end: flag: %d\n", flag);
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), wd->src, 24);
+ WBUFB(buf, 26) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ mapif_send(wd->fd, buf, 27);
return 0;
}
// アカウント変数送信
static
-int mapif_account_reg (int fd, unsigned char *src)
+int mapif_account_reg(int fd, const uint8_t *src)
{
- unsigned char buf[WBUFW (src, 2)];
+ unsigned char buf[RBUFW(src, 2)];
- memcpy (WBUFP (buf, 0), src, WBUFW (src, 2));
- WBUFW (buf, 0) = 0x3804;
- mapif_sendallwos (fd, buf, WBUFW (buf, 2));
+ memcpy(WBUFP(buf, 0), src, RBUFW(src, 2));
+ WBUFW(buf, 0) = 0x3804;
+ mapif_sendallwos(fd, buf, WBUFW(buf, 2));
return 0;
}
// アカウント変数要求返信
static
-int mapif_account_reg_reply (int fd, int account_id)
+int mapif_account_reg_reply(int fd, int account_id)
{
- struct accreg *reg = (struct accreg *)numdb_search (accreg_db, account_id);
+ struct accreg *reg = accreg_db.search(account_id);
- WFIFOW (fd, 0) = 0x3804;
- WFIFOL (fd, 4) = account_id;
+ WFIFOW(fd, 0) = 0x3804;
+ WFIFOL(fd, 4) = account_id;
if (reg == NULL)
{
- WFIFOW (fd, 2) = 8;
+ WFIFOW(fd, 2) = 8;
}
else
{
- int j, p;
+ int j, p;
for (j = 0, p = 8; j < reg->reg_num; j++, p += 36)
{
- memcpy (WFIFOP (fd, p), reg->reg[j].str, 32);
- WFIFOL (fd, p + 32) = reg->reg[j].value;
+ memcpy(WFIFOP(fd, p), reg->reg[j].str, 32);
+ WFIFOL(fd, p + 32) = reg->reg[j].value;
}
- WFIFOW (fd, 2) = p;
+ WFIFOW(fd, 2) = p;
}
- WFIFOSET (fd, WFIFOW (fd, 2));
+ WFIFOSET(fd, WFIFOW(fd, 2));
return 0;
}
@@ -396,36 +330,33 @@ int mapif_account_reg_reply (int fd, int account_id)
// Existence check of WISP data
static
-void check_ttl_wisdata_sub (db_key_t key, db_val_t data, va_list ap)
+void check_ttl_wisdata_sub(struct WisData *wd, tick_t tick)
{
- unsigned long tick;
- struct WisData *wd = (struct WisData *) data;
- tick = va_arg (ap, unsigned long);
-
- if (DIFF_TICK (tick, wd->tick) > WISDATA_TTL
+ if (tick > wd->tick + WISDATA_TTL
&& wis_delnum < WISDELLIST_MAX)
wis_dellist[wis_delnum++] = wd->id;
}
static
-int check_ttl_wisdata (void)
+int check_ttl_wisdata(void)
{
- unsigned long tick = gettick ();
- int i;
+ tick_t tick = gettick();
+ int i;
do
{
wis_delnum = 0;
- numdb_foreach (wis_db, check_ttl_wisdata_sub, tick);
+ for (auto& pair : wis_db)
+ check_ttl_wisdata_sub(&pair.second, tick);
for (i = 0; i < wis_delnum; i++)
{
- struct WisData *wd = (struct WisData *)numdb_search (wis_db, wis_dellist[i]);
- printf ("inter: wis data id=%d time out : from %s to %s\n",
+ struct WisData *wd = wis_db.search(wis_dellist[i]);
+ assert (wd);
+ PRINTF("inter: wis data id=%d time out : from %s to %s\n",
wd->id, wd->src, wd->dst);
// removed. not send information after a timeout. Just no answer for the player
//mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- numdb_erase (wis_db, wd->id);
- free (wd);
+ wis_db.erase(wd->id);
}
}
while (wis_delnum >= WISDELLIST_MAX);
@@ -438,72 +369,65 @@ int check_ttl_wisdata (void)
// GMメッセージ送信
static
-int mapif_parse_GMmessage (int fd)
+int mapif_parse_GMmessage(int fd)
{
- mapif_GMmessage (RFIFOP (fd, 4), RFIFOW (fd, 2));
+ mapif_GMmessage(static_cast<const uint8_t *>(RFIFOP(fd, 4)), RFIFOW(fd, 2));
return 0;
}
// Wisp/page request to send
static
-int mapif_parse_WisRequest (int fd)
+int mapif_parse_WisRequest(int fd)
{
- struct WisData *wd;
static int wisid = 0;
- int index;
+ int index;
- if (RFIFOW (fd, 2) - 52 >= sizeof (wd->msg))
- {
- printf ("inter: Wis message size too long.\n");
- return 0;
- }
- else if (RFIFOW (fd, 2) - 52 <= 0)
+ if (RFIFOW(fd, 2) - 52 <= 0)
{ // normaly, impossible, but who knows...
- printf ("inter: Wis message doesn't exist.\n");
+ PRINTF("inter: Wis message doesn't exist.\n");
return 0;
}
// search if character exists before to ask all map-servers
- if ((index = search_character_index ((const char *)RFIFOP (fd, 28))) == -1)
+ if ((index = search_character_index((const char *)RFIFOP(fd, 28))) == -1)
{
unsigned char buf[27];
- WBUFW (buf, 0) = 0x3802;
- memcpy (WBUFP (buf, 2), RFIFOP (fd, 4), 24);
- WBUFB (buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send (fd, buf, 27);
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
+ WBUFB(buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ mapif_send(fd, buf, 27);
// Character exists. So, ask all map-servers
}
else
{
// to be sure of the correct name, rewrite it
- memset (RFIFOP (fd, 28), 0, 24);
- strncpy ((char *)RFIFOP (fd, 28), search_character_name (index), 24);
+ strzcpy(static_cast<char *>(const_cast<void *>(RFIFOP(fd, 28))), search_character_name(index), 24);
// if source is destination, don't ask other servers.
- if (strcmp ((const char *)RFIFOP (fd, 4), (const char *)RFIFOP (fd, 28)) == 0)
+ if (strcmp((const char *)RFIFOP(fd, 4), (const char *)RFIFOP(fd, 28)) == 0)
{
unsigned char buf[27];
- WBUFW (buf, 0) = 0x3802;
- memcpy (WBUFP (buf, 2), RFIFOP (fd, 4), 24);
- WBUFB (buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send (fd, buf, 27);
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
+ WBUFB(buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ mapif_send(fd, buf, 27);
}
else
{
- CREATE (wd, struct WisData, 1);
+ struct WisData wd;
// Whether the failure of previous wisp/page transmission (timeout)
- check_ttl_wisdata ();
-
- wd->id = ++wisid;
- wd->fd = fd;
- wd->len = RFIFOW (fd, 2) - 52;
- memcpy (wd->src, RFIFOP (fd, 4), 24);
- memcpy (wd->dst, RFIFOP (fd, 28), 24);
- memcpy (wd->msg, RFIFOP (fd, 52), wd->len);
- wd->tick = gettick ();
- numdb_insert (wis_db, wd->id, wd);
- mapif_wis_message (wd);
+ check_ttl_wisdata();
+
+ wd.id = ++wisid;
+ wd.fd = fd;
+ size_t len = RFIFOW(fd, 2) - 52;
+ memcpy(wd.src, RFIFOP(fd, 4), 24);
+ memcpy(wd.dst, RFIFOP(fd, 28), 24);
+ wd.msg = std::string(static_cast<const char *>(RFIFOP(fd, 52)), len);
+ wd.tick = gettick();
+ wis_db.insert(wd.id, wd);
+ mapif_wis_message(&wd);
}
}
@@ -512,19 +436,18 @@ int mapif_parse_WisRequest (int fd)
// Wisp/page transmission result
static
-int mapif_parse_WisReply (int fd)
+int mapif_parse_WisReply(int fd)
{
- int id = RFIFOL (fd, 2), flag = RFIFOB (fd, 6);
- struct WisData *wd = (struct WisData *)numdb_search (wis_db, id);
+ int id = RFIFOL(fd, 2), flag = RFIFOB(fd, 6);
+ struct WisData *wd = wis_db.search(id);
if (wd == NULL)
return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server
if ((--wd->count) <= 0 || flag != 1)
{
- mapif_wis_end (wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- numdb_erase (wis_db, id);
- free (wd);
+ mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ wis_db.erase(id);
}
return 0;
@@ -532,50 +455,50 @@ int mapif_parse_WisReply (int fd)
// Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers)
static
-int mapif_parse_WisToGM (int fd)
+int mapif_parse_WisToGM(int fd)
{
- unsigned char buf[RFIFOW (fd, 2)]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
+ unsigned char buf[RFIFOW(fd, 2)]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
- memcpy (WBUFP (buf, 0), RFIFOP (fd, 0), RFIFOW (fd, 2));
- WBUFW (buf, 0) = 0x3803;
- mapif_sendall (buf, RFIFOW (fd, 2));
+ memcpy(WBUFP(buf, 0), RFIFOP(fd, 0), RFIFOW(fd, 2));
+ WBUFW(buf, 0) = 0x3803;
+ mapif_sendall(buf, RFIFOW(fd, 2));
return 0;
}
// アカウント変数保存要求
static
-int mapif_parse_AccReg (int fd)
+int mapif_parse_AccReg(int fd)
{
- int j, p;
- struct accreg *reg = (struct accreg*)numdb_search (accreg_db, (numdb_key_t)RFIFOL (fd, 4));
+ int j, p;
+ struct accreg *reg = accreg_db.search(RFIFOL(fd, 4));
if (reg == NULL)
{
- CREATE (reg, struct accreg, 1);
- reg->account_id = RFIFOL (fd, 4);
- numdb_insert (accreg_db, (numdb_key_t)RFIFOL (fd, 4), reg);
+ int account_id = RFIFOL(fd, 4);
+ reg = accreg_db.init(account_id);
+ reg->account_id = account_id;
}
- for (j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW (fd, 2);
+ for (j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW(fd, 2);
j++, p += 36)
{
- memcpy (reg->reg[j].str, RFIFOP (fd, p), 32);
- reg->reg[j].value = RFIFOL (fd, p + 32);
+ memcpy(reg->reg[j].str, RFIFOP(fd, p), 32);
+ reg->reg[j].value = RFIFOL(fd, p + 32);
}
reg->reg_num = j;
- mapif_account_reg (fd, RFIFOP (fd, 0)); // 他のMAPサーバーに送信
+ // 他のMAPサーバーに送信
+ mapif_account_reg(fd, static_cast<const uint8_t *>(RFIFOP(fd, 0)));
return 0;
}
// アカウント変数送信要求
static
-int mapif_parse_AccRegRequest (int fd)
+int mapif_parse_AccRegRequest(int fd)
{
-// printf("mapif: accreg request\n");
- return mapif_account_reg_reply (fd, RFIFOL (fd, 2));
+ return mapif_account_reg_reply(fd, RFIFOL(fd, 2));
}
//--------------------------------------------------------
@@ -583,71 +506,69 @@ int mapif_parse_AccRegRequest (int fd)
// map server からの通信(1パケットのみ解析すること)
// エラーなら0(false)、処理できたなら1、
// パケット長が足りなければ2をかえさなければならない
-int inter_parse_frommap (int fd)
+int inter_parse_frommap(int fd)
{
- int cmd = RFIFOW (fd, 0);
- int len = 0;
+ int cmd = RFIFOW(fd, 0);
+ int len = 0;
// inter鯖管轄かを調べる
if (cmd < 0x3000
|| cmd >=
0x3000 +
- (sizeof (inter_recv_packet_length) /
- sizeof (inter_recv_packet_length[0])))
+ (sizeof(inter_recv_packet_length) /
+ sizeof(inter_recv_packet_length[0])))
return 0;
// パケット長を調べる
if ((len =
- inter_check_length (fd,
+ inter_check_length(fd,
inter_recv_packet_length[cmd - 0x3000])) == 0)
return 2;
switch (cmd)
{
case 0x3000:
- mapif_parse_GMmessage (fd);
+ mapif_parse_GMmessage(fd);
break;
case 0x3001:
- mapif_parse_WisRequest (fd);
+ mapif_parse_WisRequest(fd);
break;
case 0x3002:
- mapif_parse_WisReply (fd);
+ mapif_parse_WisReply(fd);
break;
case 0x3003:
- mapif_parse_WisToGM (fd);
+ mapif_parse_WisToGM(fd);
break;
case 0x3004:
- mapif_parse_AccReg (fd);
+ mapif_parse_AccReg(fd);
break;
case 0x3005:
- mapif_parse_AccRegRequest (fd);
+ mapif_parse_AccRegRequest(fd);
break;
default:
- if (inter_party_parse_frommap (fd))
- break;
- if (inter_guild_parse_frommap (fd))
+ if (inter_party_parse_frommap(fd))
break;
- if (inter_storage_parse_frommap (fd))
+ if (inter_storage_parse_frommap(fd))
break;
return 0;
}
- RFIFOSKIP (fd, len);
+ RFIFOSKIP(fd, len);
return 1;
}
// RFIFOのパケット長確認
// 必要パケット長があればパケット長、まだ足りなければ0
-int inter_check_length (int fd, int length)
+int inter_check_length(int fd, int length)
{
if (length == -1)
{ // 可変パケット長
- if (RFIFOREST (fd) < 4) // パケット長が未着
+ if (RFIFOREST(fd) < 4) // パケット長が未着
return 0;
- length = RFIFOW (fd, 2);
+ length = RFIFOW(fd, 2);
}
- if (RFIFOREST (fd) < length) // パケットが未着
+ if (RFIFOREST(fd) < length) // パケットが未着
return 0;
return length;