summaryrefslogtreecommitdiff
path: root/servergreps/hercules/20130000/src/char.c
diff options
context:
space:
mode:
Diffstat (limited to 'servergreps/hercules/20130000/src/char.c')
-rw-r--r--servergreps/hercules/20130000/src/char.c16373
1 files changed, 16373 insertions, 0 deletions
diff --git a/servergreps/hercules/20130000/src/char.c b/servergreps/hercules/20130000/src/char.c
new file mode 100644
index 0000000..7658eff
--- /dev/null
+++ b/servergreps/hercules/20130000/src/char.c
@@ -0,0 +1,16373 @@
+# 1 "../../../server-code/src/char/char.c"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "/usr/include/stdc-predef.h" 1 3 4
+# 1 "<command-line>" 2
+# 1 "../../../server-code/src/char/char.c"
+# 23 "../../../server-code/src/char/char.c"
+# 1 "../../../server-code/src/config/core.h" 1
+# 90 "../../../server-code/src/config/core.h"
+# 1 "../../../server-code/src/config/./renewal.h" 1
+# 91 "../../../server-code/src/config/core.h" 2
+# 1 "../../../server-code/src/config/./secure.h" 1
+# 92 "../../../server-code/src/config/core.h" 2
+# 1 "../../../server-code/src/config/./classes/general.h" 1
+# 93 "../../../server-code/src/config/core.h" 2
+
+
+
+
+# 1 "../../../server-code/src/config/./const.h" 1
+# 62 "../../../server-code/src/config/./const.h"
+ typedef short defType;
+# 98 "../../../server-code/src/config/core.h" 2
+# 24 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/char.h" 1
+# 24 "../../../server-code/src/char/char.h"
+# 1 "../../../server-code/src/common/hercules.h" 1
+# 24 "../../../server-code/src/common/hercules.h"
+# 1 "../../../server-code/src/common/cbasetypes.h" 1
+# 116 "../../../server-code/src/common/cbasetypes.h"
+# 1 "/usr/include/inttypes.h" 1 3 4
+# 25 "/usr/include/inttypes.h" 3 4
+# 1 "/usr/include/features.h" 1 3 4
+# 361 "/usr/include/features.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
+# 410 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
+# 411 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
+# 362 "/usr/include/features.h" 2 3 4
+# 385 "/usr/include/features.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
+# 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
+# 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
+# 386 "/usr/include/features.h" 2 3 4
+# 26 "/usr/include/inttypes.h" 2 3 4
+
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h" 1 3 4
+# 9 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h" 3 4
+# 1 "/usr/include/stdint.h" 1 3 4
+# 26 "/usr/include/stdint.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wchar.h" 1 3 4
+# 27 "/usr/include/stdint.h" 2 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
+# 28 "/usr/include/stdint.h" 2 3 4
+# 36 "/usr/include/stdint.h" 3 4
+
+# 36 "/usr/include/stdint.h" 3 4
+typedef signed char int8_t;
+typedef short int int16_t;
+typedef int int32_t;
+
+typedef long int int64_t;
+
+
+
+
+
+
+
+typedef unsigned char uint8_t;
+typedef unsigned short int uint16_t;
+
+typedef unsigned int uint32_t;
+
+
+
+typedef unsigned long int uint64_t;
+# 65 "/usr/include/stdint.h" 3 4
+typedef signed char int_least8_t;
+typedef short int int_least16_t;
+typedef int int_least32_t;
+
+typedef long int int_least64_t;
+
+
+
+
+
+
+typedef unsigned char uint_least8_t;
+typedef unsigned short int uint_least16_t;
+typedef unsigned int uint_least32_t;
+
+typedef unsigned long int uint_least64_t;
+# 90 "/usr/include/stdint.h" 3 4
+typedef signed char int_fast8_t;
+
+typedef long int int_fast16_t;
+typedef long int int_fast32_t;
+typedef long int int_fast64_t;
+# 103 "/usr/include/stdint.h" 3 4
+typedef unsigned char uint_fast8_t;
+
+typedef unsigned long int uint_fast16_t;
+typedef unsigned long int uint_fast32_t;
+typedef unsigned long int uint_fast64_t;
+# 119 "/usr/include/stdint.h" 3 4
+typedef long int intptr_t;
+
+
+typedef unsigned long int uintptr_t;
+# 134 "/usr/include/stdint.h" 3 4
+typedef long int intmax_t;
+typedef unsigned long int uintmax_t;
+# 10 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h" 2 3 4
+# 28 "/usr/include/inttypes.h" 2 3 4
+
+
+
+
+
+
+typedef int __gwchar_t;
+# 266 "/usr/include/inttypes.h" 3 4
+
+
+
+
+
+typedef struct
+ {
+ long int quot;
+ long int rem;
+ } imaxdiv_t;
+# 290 "/usr/include/inttypes.h" 3 4
+extern intmax_t imaxabs (intmax_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+
+
+extern imaxdiv_t imaxdiv (intmax_t __numer, intmax_t __denom)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+
+
+extern intmax_t strtoimax (const char *__restrict __nptr,
+ char **__restrict __endptr, int __base) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern uintmax_t strtoumax (const char *__restrict __nptr,
+ char ** __restrict __endptr, int __base) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern intmax_t wcstoimax (const __gwchar_t *__restrict __nptr,
+ __gwchar_t **__restrict __endptr, int __base)
+ __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern uintmax_t wcstoumax (const __gwchar_t *__restrict __nptr,
+ __gwchar_t ** __restrict __endptr, int __base)
+ __attribute__ ((__nothrow__ , __leaf__));
+# 432 "/usr/include/inttypes.h" 3 4
+
+# 117 "../../../server-code/src/common/cbasetypes.h" 2
+
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h" 1 3 4
+# 34 "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h" 3 4
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/syslimits.h" 1 3 4
+
+
+
+
+
+
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h" 1 3 4
+# 168 "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h" 3 4
+# 1 "/usr/include/limits.h" 1 3 4
+# 143 "/usr/include/limits.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/posix1_lim.h" 1 3 4
+# 160 "/usr/include/x86_64-linux-gnu/bits/posix1_lim.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/local_lim.h" 1 3 4
+# 38 "/usr/include/x86_64-linux-gnu/bits/local_lim.h" 3 4
+# 1 "/usr/include/linux/limits.h" 1 3 4
+# 39 "/usr/include/x86_64-linux-gnu/bits/local_lim.h" 2 3 4
+# 161 "/usr/include/x86_64-linux-gnu/bits/posix1_lim.h" 2 3 4
+# 144 "/usr/include/limits.h" 2 3 4
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/posix2_lim.h" 1 3 4
+# 148 "/usr/include/limits.h" 2 3 4
+# 169 "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h" 2 3 4
+# 8 "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/syslimits.h" 2 3 4
+# 35 "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h" 2 3 4
+# 119 "../../../server-code/src/common/cbasetypes.h" 2
+# 1 "/usr/include/time.h" 1 3 4
+# 29 "/usr/include/time.h" 3 4
+
+
+
+
+
+
+
+
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 216 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 4
+typedef long unsigned int size_t;
+# 38 "/usr/include/time.h" 2 3 4
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/time.h" 1 3 4
+# 42 "/usr/include/time.h" 2 3 4
+# 55 "/usr/include/time.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/types.h" 1 3 4
+# 27 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
+# 28 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4
+
+
+typedef unsigned char __u_char;
+typedef unsigned short int __u_short;
+typedef unsigned int __u_int;
+typedef unsigned long int __u_long;
+
+
+typedef signed char __int8_t;
+typedef unsigned char __uint8_t;
+typedef signed short int __int16_t;
+typedef unsigned short int __uint16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+
+typedef signed long int __int64_t;
+typedef unsigned long int __uint64_t;
+
+
+
+
+
+
+
+typedef long int __quad_t;
+typedef unsigned long int __u_quad_t;
+# 121 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/typesizes.h" 1 3 4
+# 122 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4
+
+
+typedef unsigned long int __dev_t;
+typedef unsigned int __uid_t;
+typedef unsigned int __gid_t;
+typedef unsigned long int __ino_t;
+typedef unsigned long int __ino64_t;
+typedef unsigned int __mode_t;
+typedef unsigned long int __nlink_t;
+typedef long int __off_t;
+typedef long int __off64_t;
+typedef int __pid_t;
+typedef struct { int __val[2]; } __fsid_t;
+typedef long int __clock_t;
+typedef unsigned long int __rlim_t;
+typedef unsigned long int __rlim64_t;
+typedef unsigned int __id_t;
+typedef long int __time_t;
+typedef unsigned int __useconds_t;
+typedef long int __suseconds_t;
+
+typedef int __daddr_t;
+typedef int __key_t;
+
+
+typedef int __clockid_t;
+
+
+typedef void * __timer_t;
+
+
+typedef long int __blksize_t;
+
+
+
+
+typedef long int __blkcnt_t;
+typedef long int __blkcnt64_t;
+
+
+typedef unsigned long int __fsblkcnt_t;
+typedef unsigned long int __fsblkcnt64_t;
+
+
+typedef unsigned long int __fsfilcnt_t;
+typedef unsigned long int __fsfilcnt64_t;
+
+
+typedef long int __fsword_t;
+
+typedef long int __ssize_t;
+
+
+typedef long int __syscall_slong_t;
+
+typedef unsigned long int __syscall_ulong_t;
+
+
+
+typedef __off64_t __loff_t;
+typedef __quad_t *__qaddr_t;
+typedef char *__caddr_t;
+
+
+typedef long int __intptr_t;
+
+
+typedef unsigned int __socklen_t;
+# 56 "/usr/include/time.h" 2 3 4
+
+
+
+typedef __clock_t clock_t;
+
+
+
+# 73 "/usr/include/time.h" 3 4
+
+
+typedef __time_t time_t;
+
+
+
+# 91 "/usr/include/time.h" 3 4
+typedef __clockid_t clockid_t;
+# 103 "/usr/include/time.h" 3 4
+typedef __timer_t timer_t;
+# 120 "/usr/include/time.h" 3 4
+struct timespec
+ {
+ __time_t tv_sec;
+ __syscall_slong_t tv_nsec;
+ };
+
+
+
+
+
+
+
+
+struct tm
+{
+ int tm_sec;
+ int tm_min;
+ int tm_hour;
+ int tm_mday;
+ int tm_mon;
+ int tm_year;
+ int tm_wday;
+ int tm_yday;
+ int tm_isdst;
+
+
+ long int tm_gmtoff;
+ const char *tm_zone;
+
+
+
+
+};
+
+
+
+
+
+
+
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+
+struct sigevent;
+
+
+
+
+
+typedef __pid_t pid_t;
+# 186 "/usr/include/time.h" 3 4
+
+
+
+extern clock_t clock (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern time_t time (time_t *__timer) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern double difftime (time_t __time1, time_t __time0)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+
+
+extern time_t mktime (struct tm *__tp) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern size_t strftime (char *__restrict __s, size_t __maxsize,
+ const char *__restrict __format,
+ const struct tm *__restrict __tp) __attribute__ ((__nothrow__ , __leaf__));
+
+# 221 "/usr/include/time.h" 3 4
+# 1 "/usr/include/xlocale.h" 1 3 4
+# 27 "/usr/include/xlocale.h" 3 4
+typedef struct __locale_struct
+{
+
+ struct __locale_data *__locales[13];
+
+
+ const unsigned short int *__ctype_b;
+ const int *__ctype_tolower;
+ const int *__ctype_toupper;
+
+
+ const char *__names[13];
+} *__locale_t;
+
+
+typedef __locale_t locale_t;
+# 222 "/usr/include/time.h" 2 3 4
+
+extern size_t strftime_l (char *__restrict __s, size_t __maxsize,
+ const char *__restrict __format,
+ const struct tm *__restrict __tp,
+ __locale_t __loc) __attribute__ ((__nothrow__ , __leaf__));
+# 236 "/usr/include/time.h" 3 4
+
+
+
+extern struct tm *gmtime (const time_t *__timer) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern struct tm *localtime (const time_t *__timer) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern struct tm *gmtime_r (const time_t *__restrict __timer,
+ struct tm *__restrict __tp) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern struct tm *localtime_r (const time_t *__restrict __timer,
+ struct tm *__restrict __tp) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern char *asctime (const struct tm *__tp) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern char *ctime (const time_t *__timer) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+
+extern char *asctime_r (const struct tm *__restrict __tp,
+ char *__restrict __buf) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern char *ctime_r (const time_t *__restrict __timer,
+ char *__restrict __buf) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern char *__tzname[2];
+extern int __daylight;
+extern long int __timezone;
+
+
+
+
+extern char *tzname[2];
+
+
+
+extern void tzset (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern int daylight;
+extern long int timezone;
+
+
+
+
+
+extern int stime (const time_t *__when) __attribute__ ((__nothrow__ , __leaf__));
+# 319 "/usr/include/time.h" 3 4
+extern time_t timegm (struct tm *__tp) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern time_t timelocal (struct tm *__tp) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int dysize (int __year) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+# 334 "/usr/include/time.h" 3 4
+extern int nanosleep (const struct timespec *__requested_time,
+ struct timespec *__remaining);
+
+
+
+extern int clock_getres (clockid_t __clock_id, struct timespec *__res) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int clock_settime (clockid_t __clock_id, const struct timespec *__tp)
+ __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+extern int clock_nanosleep (clockid_t __clock_id, int __flags,
+ const struct timespec *__req,
+ struct timespec *__rem);
+
+
+extern int clock_getcpuclockid (pid_t __pid, clockid_t *__clock_id) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern int timer_create (clockid_t __clock_id,
+ struct sigevent *__restrict __evp,
+ timer_t *__restrict __timerid) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int timer_delete (timer_t __timerid) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int timer_settime (timer_t __timerid, int __flags,
+ const struct itimerspec *__restrict __value,
+ struct itimerspec *__restrict __ovalue) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int timer_gettime (timer_t __timerid, struct itimerspec *__value)
+ __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int timer_getoverrun (timer_t __timerid) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern int timespec_get (struct timespec *__ts, int __base)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+# 430 "/usr/include/time.h" 3 4
+
+# 120 "../../../server-code/src/common/cbasetypes.h" 2
+# 140 "../../../server-code/src/common/cbasetypes.h"
+
+# 140 "../../../server-code/src/common/cbasetypes.h"
+typedef int8_t int8;
+typedef int16_t int16;
+typedef int32_t int32;
+typedef int64_t int64;
+
+typedef int8_t sint8;
+typedef int16_t sint16;
+typedef int32_t sint32;
+typedef int64_t sint64;
+
+typedef uint8_t uint8;
+typedef uint16_t uint16;
+typedef uint32_t uint32;
+typedef uint64_t uint64;
+# 196 "../../../server-code/src/common/cbasetypes.h"
+typedef long int ppint;
+typedef long int ppint8;
+typedef long int ppint16;
+typedef long int ppint32;
+
+typedef unsigned long int ppuint;
+typedef unsigned long int ppuint8;
+typedef unsigned long int ppuint16;
+typedef unsigned long int ppuint32;
+
+
+
+
+
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 149 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 4
+
+# 149 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 4
+typedef long int ptrdiff_t;
+# 328 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 4
+typedef int wchar_t;
+# 426 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 4
+typedef struct {
+ long long __max_align_ll __attribute__((__aligned__(__alignof__(long long))));
+ long double __max_align_ld __attribute__((__aligned__(__alignof__(long double))));
+} max_align_t;
+# 211 "../../../server-code/src/common/cbasetypes.h" 2
+# 227 "../../../server-code/src/common/cbasetypes.h"
+
+# 227 "../../../server-code/src/common/cbasetypes.h"
+typedef intptr_t intptr;
+typedef uintptr_t uintptr;
+
+
+
+
+
+
+
+ typedef int64 sysint;
+ typedef uint64 usysint;
+# 305 "../../../server-code/src/common/cbasetypes.h"
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stdbool.h" 1 3 4
+# 306 "../../../server-code/src/common/cbasetypes.h" 2
+# 395 "../../../server-code/src/common/cbasetypes.h"
+# 1 "/usr/include/ctype.h" 1 3 4
+# 28 "/usr/include/ctype.h" 3 4
+
+# 39 "/usr/include/ctype.h" 3 4
+# 1 "/usr/include/endian.h" 1 3 4
+# 36 "/usr/include/endian.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/endian.h" 1 3 4
+# 37 "/usr/include/endian.h" 2 3 4
+# 60 "/usr/include/endian.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 1 3 4
+# 28 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
+# 29 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 2 3 4
+
+
+
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/byteswap-16.h" 1 3 4
+# 36 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 2 3 4
+# 44 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 3 4
+
+# 44 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 3 4
+static __inline unsigned int
+__bswap_32 (unsigned int __bsx)
+{
+ return __builtin_bswap32 (__bsx);
+}
+# 108 "/usr/include/x86_64-linux-gnu/bits/byteswap.h" 3 4
+static __inline __uint64_t
+__bswap_64 (__uint64_t __bsx)
+{
+ return __builtin_bswap64 (__bsx);
+}
+# 61 "/usr/include/endian.h" 2 3 4
+# 40 "/usr/include/ctype.h" 2 3 4
+
+
+
+
+
+
+enum
+{
+ _ISupper = ((0) < 8 ? ((1 << (0)) << 8) : ((1 << (0)) >> 8)),
+ _ISlower = ((1) < 8 ? ((1 << (1)) << 8) : ((1 << (1)) >> 8)),
+ _ISalpha = ((2) < 8 ? ((1 << (2)) << 8) : ((1 << (2)) >> 8)),
+ _ISdigit = ((3) < 8 ? ((1 << (3)) << 8) : ((1 << (3)) >> 8)),
+ _ISxdigit = ((4) < 8 ? ((1 << (4)) << 8) : ((1 << (4)) >> 8)),
+ _ISspace = ((5) < 8 ? ((1 << (5)) << 8) : ((1 << (5)) >> 8)),
+ _ISprint = ((6) < 8 ? ((1 << (6)) << 8) : ((1 << (6)) >> 8)),
+ _ISgraph = ((7) < 8 ? ((1 << (7)) << 8) : ((1 << (7)) >> 8)),
+ _ISblank = ((8) < 8 ? ((1 << (8)) << 8) : ((1 << (8)) >> 8)),
+ _IScntrl = ((9) < 8 ? ((1 << (9)) << 8) : ((1 << (9)) >> 8)),
+ _ISpunct = ((10) < 8 ? ((1 << (10)) << 8) : ((1 << (10)) >> 8)),
+ _ISalnum = ((11) < 8 ? ((1 << (11)) << 8) : ((1 << (11)) >> 8))
+};
+# 79 "/usr/include/ctype.h" 3 4
+extern const unsigned short int **__ctype_b_loc (void)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+extern const __int32_t **__ctype_tolower_loc (void)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+extern const __int32_t **__ctype_toupper_loc (void)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+# 104 "/usr/include/ctype.h" 3 4
+
+
+
+
+
+
+extern int isalnum (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int isalpha (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int iscntrl (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int isdigit (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int islower (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int isgraph (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int isprint (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int ispunct (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int isspace (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int isupper (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int isxdigit (int) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern int tolower (int __c) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int toupper (int __c) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+
+
+extern int isblank (int) __attribute__ ((__nothrow__ , __leaf__));
+
+
+# 150 "/usr/include/ctype.h" 3 4
+extern int isascii (int __c) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern int toascii (int __c) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern int _toupper (int) __attribute__ ((__nothrow__ , __leaf__));
+extern int _tolower (int) __attribute__ ((__nothrow__ , __leaf__));
+# 271 "/usr/include/ctype.h" 3 4
+extern int isalnum_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int isalpha_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int iscntrl_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int isdigit_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int islower_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int isgraph_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int isprint_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int ispunct_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int isspace_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int isupper_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+extern int isxdigit_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+
+extern int isblank_l (int, __locale_t) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern int __tolower_l (int __c, __locale_t __l) __attribute__ ((__nothrow__ , __leaf__));
+extern int tolower_l (int __c, __locale_t __l) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int __toupper_l (int __c, __locale_t __l) __attribute__ ((__nothrow__ , __leaf__));
+extern int toupper_l (int __c, __locale_t __l) __attribute__ ((__nothrow__ , __leaf__));
+# 347 "/usr/include/ctype.h" 3 4
+
+# 396 "../../../server-code/src/common/cbasetypes.h" 2
+# 417 "../../../server-code/src/common/cbasetypes.h"
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h" 1 3 4
+# 40 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h" 3 4
+typedef __builtin_va_list __gnuc_va_list;
+# 98 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h" 3 4
+typedef __gnuc_va_list va_list;
+# 418 "../../../server-code/src/common/cbasetypes.h" 2
+# 25 "../../../server-code/src/common/hercules.h" 2
+# 25 "../../../server-code/src/char/char.h" 2
+# 1 "../../../server-code/src/common/core.h" 1
+# 25 "../../../server-code/src/common/core.h"
+# 1 "../../../server-code/src/common/db.h" 1
+# 90 "../../../server-code/src/common/db.h"
+
+# 90 "../../../server-code/src/common/db.h"
+enum DBReleaseOption {
+ DB_RELEASE_NOTHING = 0x0,
+ DB_RELEASE_KEY = 0x1,
+ DB_RELEASE_DATA = 0x2,
+ DB_RELEASE_BOTH = DB_RELEASE_KEY|DB_RELEASE_DATA,
+};
+# 117 "../../../server-code/src/common/db.h"
+enum DBType {
+ DB_INT,
+ DB_UINT,
+ DB_STRING,
+ DB_ISTRING,
+ DB_INT64,
+ DB_UINT64,
+};
+# 148 "../../../server-code/src/common/db.h"
+enum DBOptions {
+ DB_OPT_BASE = 0x00,
+ DB_OPT_DUP_KEY = 0x01,
+ DB_OPT_RELEASE_KEY = 0x02,
+ DB_OPT_RELEASE_DATA = 0x04,
+ DB_OPT_RELEASE_BOTH = DB_OPT_RELEASE_KEY|DB_OPT_RELEASE_DATA,
+ DB_OPT_ALLOW_NULL_KEY = 0x08,
+ DB_OPT_ALLOW_NULL_DATA = 0x10,
+};
+# 169 "../../../server-code/src/common/db.h"
+union DBKey {
+ int i;
+ unsigned int ui;
+ const char *str;
+ char *mutstr;
+ int64 i64;
+ uint64 ui64;
+};
+# 186 "../../../server-code/src/common/db.h"
+enum DBDataType {
+ DB_DATA_INT,
+ DB_DATA_UINT,
+ DB_DATA_PTR,
+};
+# 201 "../../../server-code/src/common/db.h"
+struct DBData {
+ enum DBDataType type;
+ union {
+ int i;
+ unsigned int ui;
+ void *ptr;
+ } u;
+};
+# 220 "../../../server-code/src/common/db.h"
+typedef struct DBData (*DBCreateData)(union DBKey key, va_list args);
+# 237 "../../../server-code/src/common/db.h"
+typedef int (*DBApply)(union DBKey key, struct DBData *data, va_list args);
+# 250 "../../../server-code/src/common/db.h"
+typedef int (*DBMatcher)(union DBKey key, struct DBData data, va_list args);
+# 264 "../../../server-code/src/common/db.h"
+typedef int (*DBComparator)(union DBKey key1, union DBKey key2, unsigned short maxlen);
+# 276 "../../../server-code/src/common/db.h"
+typedef uint64 (*DBHasher)(union DBKey key, unsigned short maxlen);
+# 290 "../../../server-code/src/common/db.h"
+typedef void (*DBReleaser)(union DBKey key, struct DBData data, enum DBReleaseOption which);
+# 304 "../../../server-code/src/common/db.h"
+struct DBIterator {
+# 314 "../../../server-code/src/common/db.h"
+ struct DBData *(*first)(struct DBIterator *self, union DBKey *out_key);
+# 325 "../../../server-code/src/common/db.h"
+ struct DBData *(*last)(struct DBIterator *self, union DBKey *out_key);
+# 336 "../../../server-code/src/common/db.h"
+ struct DBData *(*next)(struct DBIterator *self, union DBKey *out_key);
+# 347 "../../../server-code/src/common/db.h"
+ struct DBData *(*prev)(struct DBIterator *self, union DBKey *out_key);
+# 357 "../../../server-code/src/common/db.h"
+
+# 357 "../../../server-code/src/common/db.h" 3 4
+_Bool
+# 357 "../../../server-code/src/common/db.h"
+ (*exists)(struct DBIterator *self);
+# 372 "../../../server-code/src/common/db.h"
+ int (*remove)(struct DBIterator *self, struct DBData *out_data);
+
+
+
+
+
+
+ void (*destroy)(struct DBIterator *self);
+
+};
+
+
+
+
+
+
+
+struct DBMap {
+# 400 "../../../server-code/src/common/db.h"
+ struct DBIterator *(*iterator)(struct DBMap *self);
+# 409 "../../../server-code/src/common/db.h"
+
+# 409 "../../../server-code/src/common/db.h" 3 4
+_Bool
+# 409 "../../../server-code/src/common/db.h"
+ (*exists)(struct DBMap *self, union DBKey key);
+# 418 "../../../server-code/src/common/db.h"
+ struct DBData *(*get)(struct DBMap *self, union DBKey key);
+# 438 "../../../server-code/src/common/db.h"
+ unsigned int (*getall)(struct DBMap *self, struct DBData **buf, unsigned int max, DBMatcher match, ...);
+# 456 "../../../server-code/src/common/db.h"
+ unsigned int (*vgetall)(struct DBMap *self, struct DBData **buf, unsigned int max, DBMatcher match, va_list args);
+# 472 "../../../server-code/src/common/db.h"
+ struct DBData *(*ensure)(struct DBMap *self, union DBKey key, DBCreateData create, ...);
+# 486 "../../../server-code/src/common/db.h"
+ struct DBData *(*vensure)(struct DBMap *self, union DBKey key, DBCreateData create, va_list args);
+# 499 "../../../server-code/src/common/db.h"
+ int (*put)(struct DBMap *self, union DBKey key, struct DBData data, struct DBData *out_data);
+# 511 "../../../server-code/src/common/db.h"
+ int (*remove)(struct DBMap *self, union DBKey key, struct DBData *out_data);
+# 525 "../../../server-code/src/common/db.h"
+ int (*foreach)(struct DBMap *self, DBApply func, ...);
+# 537 "../../../server-code/src/common/db.h"
+ int (*vforeach)(struct DBMap *self, DBApply func, va_list args);
+# 553 "../../../server-code/src/common/db.h"
+ int (*clear)(struct DBMap *self, DBApply func, ...);
+# 567 "../../../server-code/src/common/db.h"
+ int (*vclear)(struct DBMap *self, DBApply func, va_list args);
+# 584 "../../../server-code/src/common/db.h"
+ int (*destroy)(struct DBMap *self, DBApply func, ...);
+# 599 "../../../server-code/src/common/db.h"
+ int (*vdestroy)(struct DBMap *self, DBApply func, va_list args);
+
+
+
+
+
+
+
+ unsigned int (*size)(struct DBMap *self);
+
+
+
+
+
+
+
+ enum DBType (*type)(struct DBMap *self);
+
+
+
+
+
+
+
+ enum DBOptions (*options)(struct DBMap *self);
+
+};
+# 745 "../../../server-code/src/common/db.h"
+struct db_interface {
+# 758 "../../../server-code/src/common/db.h"
+enum DBOptions (*fix_options) (enum DBType type, enum DBOptions options);
+# 768 "../../../server-code/src/common/db.h"
+DBComparator (*default_cmp) (enum DBType type);
+# 778 "../../../server-code/src/common/db.h"
+DBHasher (*default_hash) (enum DBType type);
+# 797 "../../../server-code/src/common/db.h"
+DBReleaser (*default_release) (enum DBType type, enum DBOptions options);
+# 808 "../../../server-code/src/common/db.h"
+DBReleaser (*custom_release) (enum DBReleaseOption which);
+# 834 "../../../server-code/src/common/db.h"
+struct DBMap *(*alloc) (const char *file, const char *func, int line, enum DBType type, enum DBOptions options, unsigned short maxlen);
+
+
+
+
+
+
+
+union DBKey (*i2key) (int key);
+
+
+
+
+
+
+
+union DBKey (*ui2key) (unsigned int key);
+
+
+
+
+
+
+
+union DBKey (*str2key) (const char *key);
+
+
+
+
+
+
+
+union DBKey (*i642key) (int64 key);
+
+
+
+
+
+
+
+union DBKey (*ui642key) (uint64 key);
+
+
+
+
+
+
+
+struct DBData (*i2data) (int data);
+
+
+
+
+
+
+
+struct DBData (*ui2data) (unsigned int data);
+
+
+
+
+
+
+
+struct DBData (*ptr2data) (void *data);
+# 907 "../../../server-code/src/common/db.h"
+int (*data2i) (struct DBData *data);
+# 916 "../../../server-code/src/common/db.h"
+unsigned int (*data2ui) (struct DBData *data);
+# 925 "../../../server-code/src/common/db.h"
+void* (*data2ptr) (struct DBData *data);
+
+
+
+
+
+
+void (*init) (void);
+
+
+
+
+
+
+
+void (*final) (void);
+};
+
+
+struct linkdb_node {
+ struct linkdb_node *next;
+ struct linkdb_node *prev;
+ void *key;
+ void *data;
+};
+
+typedef void (*LinkDBFunc)(void* key, void* data, va_list args);
+
+
+void linkdb_insert (struct linkdb_node** head, void *key, void* data);
+void linkdb_replace (struct linkdb_node** head, void *key, void* data);
+void* linkdb_search (struct linkdb_node** head, void *key);
+void* linkdb_erase (struct linkdb_node** head, void *key);
+void linkdb_final (struct linkdb_node** head);
+void linkdb_vforeach(struct linkdb_node** head, LinkDBFunc func, va_list ap);
+void linkdb_foreach (struct linkdb_node** head, LinkDBFunc func, ...);
+
+void db_defaults(void);
+
+
+extern struct db_interface *DB;
+# 26 "../../../server-code/src/common/core.h" 2
+# 34 "../../../server-code/src/common/core.h"
+enum server_types {
+ SERVER_TYPE_UNKNOWN = 0x0,
+ SERVER_TYPE_LOGIN = 0x1,
+ SERVER_TYPE_CHAR = 0x2,
+ SERVER_TYPE_MAP = 0x4,
+};
+
+
+enum E_CORE_ST {
+ CORE_ST_STOP = 0,
+ CORE_ST_RUN,
+ CORE_ST_LAST
+};
+
+
+enum cmdline_options {
+ CMDLINE_OPT_NORMAL = 0x0,
+ CMDLINE_OPT_PARAM = 0x1,
+ CMDLINE_OPT_SILENT = 0x2,
+ CMDLINE_OPT_PREINIT = 0x4,
+};
+typedef
+# 55 "../../../server-code/src/common/core.h" 3 4
+ _Bool
+# 55 "../../../server-code/src/common/core.h"
+ (*CmdlineExecFunc)(const char *name, const char *params);
+struct CmdlineArgData {
+ unsigned int pluginID;
+ unsigned int options;
+ char *name;
+ char shortname;
+ CmdlineExecFunc func;
+ char *help;
+};
+
+struct cmdline_interface {
+ struct { int _max_; int _len_; struct CmdlineArgData *_data_; } args_data;
+
+ void (*init) (void);
+ void (*final) (void);
+
+# 70 "../../../server-code/src/common/core.h" 3 4
+_Bool
+# 70 "../../../server-code/src/common/core.h"
+ (*arg_add) (unsigned int pluginID, const char *name, char shortname, CmdlineExecFunc func, const char *help, unsigned int options);
+ int (*exec) (int argc, char **argv, unsigned int options);
+
+# 72 "../../../server-code/src/common/core.h" 3 4
+_Bool
+# 72 "../../../server-code/src/common/core.h"
+ (*arg_next_value) (const char *name, int current_arg, int argc);
+ const char *(*arg_source) (struct CmdlineArgData *arg);
+};
+
+struct core_interface {
+ int arg_c;
+ char **arg_v;
+
+ int runflag;
+ char *server_name;
+ enum server_types server_type;
+
+
+
+ void (*shutdown_callback)(void);
+};
+
+
+
+
+
+
+extern void cmdline_args_init_local(void);
+extern int do_init(int,char**);
+extern void set_server_type(void);
+extern void do_abort(void);
+extern int do_final(void);
+
+
+
+
+
+
+
+void cmdline_defaults(void);
+
+
+extern struct core_interface *core;
+extern struct cmdline_interface *cmdline;
+# 26 "../../../server-code/src/char/char.h" 2
+
+# 1 "../../../server-code/src/common/mmo.h" 1
+# 225 "../../../server-code/src/common/mmo.h"
+struct hplugin_data_store;
+
+enum item_types {
+ IT_HEALING = 0,
+ IT_UNKNOWN,
+ IT_USABLE,
+ IT_ETC,
+ IT_WEAPON,
+ IT_ARMOR,
+ IT_CARD,
+ IT_PETEGG,
+ IT_PETARMOR,
+ IT_UNKNOWN2,
+ IT_AMMO,
+ IT_DELAYCONSUME,
+ IT_CASH = 18,
+ IT_MAX
+};
+
+
+
+
+enum quest_state {
+ Q_INACTIVE,
+ Q_ACTIVE,
+ Q_COMPLETE,
+};
+
+
+struct quest {
+ int quest_id;
+ unsigned int time;
+ int count[3];
+ enum quest_state state;
+};
+
+struct item {
+ int id;
+ short nameid;
+ short amount;
+ unsigned int equip;
+ char identify;
+ char refine;
+ char attribute;
+ short card[4];
+ unsigned int expire_time;
+ char favorite;
+ unsigned char bound;
+ uint64 unique_id;
+};
+
+
+enum equip_pos {
+ EQP_NONE = 0x000000,
+ EQP_HEAD_LOW = 0x000001,
+ EQP_HEAD_MID = 0x000200,
+ EQP_HEAD_TOP = 0x000100,
+ EQP_HAND_R = 0x000002,
+ EQP_HAND_L = 0x000020,
+ EQP_ARMOR = 0x000010,
+ EQP_SHOES = 0x000040,
+ EQP_GARMENT = 0x000004,
+ EQP_ACC_L = 0x000008,
+ EQP_ACC_R = 0x000080,
+ EQP_COSTUME_HEAD_TOP = 0x000400,
+ EQP_COSTUME_HEAD_MID = 0x000800,
+ EQP_COSTUME_HEAD_LOW = 0x001000,
+ EQP_COSTUME_GARMENT = 0x002000,
+
+ EQP_AMMO = 0x008000,
+ EQP_SHADOW_ARMOR = 0x010000,
+ EQP_SHADOW_WEAPON = 0x020000,
+ EQP_SHADOW_SHIELD = 0x040000,
+ EQP_SHADOW_SHOES = 0x080000,
+ EQP_SHADOW_ACC_R = 0x100000,
+ EQP_SHADOW_ACC_L = 0x200000,
+};
+
+struct point {
+ unsigned short map;
+ short x,y;
+};
+
+enum e_skill_flag
+{
+ SKILL_FLAG_PERMANENT,
+ SKILL_FLAG_TEMPORARY,
+ SKILL_FLAG_PLAGIARIZED,
+ SKILL_FLAG_UNUSED,
+ SKILL_FLAG_PERM_GRANTED,
+
+
+ SKILL_FLAG_REPLACED_LV_0,
+};
+
+enum e_mmo_charstatus_opt {
+ OPT_NONE = 0x0,
+ OPT_SHOW_EQUIP = 0x1,
+ OPT_ALLOW_PARTY = 0x2,
+};
+
+enum e_item_bound_type {
+ IBT_NONE = 0x0,
+ IBT_MIN = 0x1,
+ IBT_ACCOUNT = 0x1,
+ IBT_GUILD = 0x2,
+ IBT_PARTY = 0x3,
+ IBT_CHARACTER = 0x4,
+ IBT_MAX = 0x4,
+};
+
+enum {
+ OPTION_NOTHING = 0x00000000,
+ OPTION_SIGHT = 0x00000001,
+ OPTION_HIDE = 0x00000002,
+ OPTION_CLOAK = 0x00000004,
+ OPTION_FALCON = 0x00000010,
+ OPTION_RIDING = 0x00000020,
+ OPTION_INVISIBLE = 0x00000040,
+ OPTION_ORCISH = 0x00000800,
+ OPTION_WEDDING = 0x00001000,
+ OPTION_RUWACH = 0x00002000,
+ OPTION_CHASEWALK = 0x00004000,
+ OPTION_FLYING = 0x00008000,
+ OPTION_XMAS = 0x00010000,
+ OPTION_TRANSFORM = 0x00020000,
+ OPTION_SUMMER = 0x00040000,
+ OPTION_DRAGON1 = 0x00080000,
+ OPTION_WUG = 0x00100000,
+ OPTION_WUGRIDER = 0x00200000,
+ OPTION_MADOGEAR = 0x00400000,
+ OPTION_DRAGON2 = 0x00800000,
+ OPTION_DRAGON3 = 0x01000000,
+ OPTION_DRAGON4 = 0x02000000,
+ OPTION_DRAGON5 = 0x04000000,
+ OPTION_HANBOK = 0x08000000,
+ OPTION_OKTOBERFEST = 0x10000000,
+# 372 "../../../server-code/src/common/mmo.h"
+ OPTION_DRAGON = OPTION_DRAGON1|OPTION_DRAGON2|OPTION_DRAGON3|OPTION_DRAGON4|OPTION_DRAGON5,
+ OPTION_COSTUME = OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER|OPTION_HANBOK|OPTION_OKTOBERFEST,
+};
+
+struct s_skill {
+ unsigned short id;
+ unsigned char lv;
+ unsigned char flag;
+};
+
+struct script_reg_state {
+ unsigned int type : 1;
+ unsigned int update : 1;
+};
+
+struct script_reg_num {
+ struct script_reg_state flag;
+ int value;
+};
+
+struct script_reg_str {
+ struct script_reg_state flag;
+ char *value;
+};
+
+
+struct status_change_data {
+ unsigned short type;
+ int val1, val2, val3, val4;
+ int tick;
+};
+
+struct storage_data {
+ int storage_amount;
+ struct item items[600];
+};
+
+struct guild_storage {
+ int dirty;
+ int guild_id;
+ short storage_status;
+ short storage_amount;
+ struct item items[600];
+ unsigned short lock;
+};
+
+struct s_pet {
+ int account_id;
+ int char_id;
+ int pet_id;
+ short class_;
+ short level;
+ short egg_id;
+ short equip;
+ short intimate;
+ short hungry;
+ char name[(23 + 1)];
+ char rename_flag;
+ char incubate;
+};
+
+struct s_homunculus {
+ char name[(23 + 1)];
+ int hom_id;
+ int char_id;
+ short class_;
+ short prev_class;
+ int hp,max_hp,sp,max_sp;
+ unsigned int intimacy;
+ short hunger;
+ struct s_skill hskill[43];
+ short skillpts;
+ short level;
+ unsigned int exp;
+ short rename_flag;
+ short vaporize;
+ int str;
+ int agi;
+ int vit;
+ int int_;
+ int dex;
+ int luk;
+
+ int str_value;
+ int agi_value;
+ int vit_value;
+ int int_value;
+ int dex_value;
+ int luk_value;
+
+ int8 spiritball;
+};
+
+struct s_mercenary {
+ int mercenary_id;
+ int char_id;
+ short class_;
+ int hp, sp;
+ unsigned int kill_count;
+ unsigned int life_time;
+};
+
+struct s_elemental {
+ int elemental_id;
+ int char_id;
+ short class_;
+ uint32 mode;
+ int hp, sp, max_hp, max_sp, matk, atk, atk2;
+ short hit, flee, amotion, def, mdef;
+ int life_time;
+};
+
+struct s_friend {
+ int account_id;
+ int char_id;
+ char name[(23 + 1)];
+};
+
+struct hotkey {
+
+ unsigned int id;
+ unsigned short lv;
+ unsigned char type;
+
+
+
+};
+
+struct mmo_charstatus {
+ int char_id;
+ int account_id;
+ int partner_id;
+ int father;
+ int mother;
+ int child;
+
+ unsigned int base_exp,job_exp;
+ int zeny;
+ int bank_vault;
+
+ short class_;
+ unsigned int status_point,skill_point;
+ int hp,max_hp,sp,max_sp;
+ unsigned int option;
+ short manner;
+ unsigned char karma;
+ short hair,hair_color,clothes_color,body;
+ int party_id,guild_id,pet_id,hom_id,mer_id,ele_id;
+ int fame;
+
+
+ int arch_faith, arch_calls;
+ int spear_faith, spear_calls;
+ int sword_faith, sword_calls;
+
+ short weapon;
+ short shield;
+ short head_top,head_mid,head_bottom;
+ short robe;
+
+ char name[(23 + 1)];
+ unsigned int base_level,job_level;
+ short str,agi,vit,int_,dex,luk;
+ unsigned char slot,sex;
+
+ uint32 mapip;
+ uint16 mapport;
+
+ struct point last_point,save_point,memo_point[3];
+ struct item inventory[100],cart[100];
+ struct storage_data storage;
+ struct s_skill skill[1478];
+
+ struct s_friend friends[40];
+
+ struct hotkey hotkeys[38];
+
+
+# 549 "../../../server-code/src/common/mmo.h" 3 4
+_Bool
+# 549 "../../../server-code/src/common/mmo.h"
+ show_equip, allow_party;
+ unsigned short rename;
+ unsigned short slotchange;
+
+ time_t delete_date;
+
+
+ unsigned short mod_exp,mod_drop,mod_death;
+
+ unsigned char font;
+
+ uint32 uniqueitem_counter;
+
+ unsigned char hotkey_rowshift;
+};
+
+typedef enum mail_status {
+ MAIL_NEW,
+ MAIL_UNREAD,
+ MAIL_READ,
+} mail_status;
+
+struct mail_message {
+ int id;
+ int send_id;
+ char send_name[(23 + 1)];
+ int dest_id;
+ char dest_name[(23 + 1)];
+ char title[40];
+ char body[200];
+
+ mail_status status;
+ time_t timestamp;
+
+ int zeny;
+ struct item item;
+};
+
+struct mail_data {
+ short amount;
+
+# 589 "../../../server-code/src/common/mmo.h" 3 4
+_Bool
+# 589 "../../../server-code/src/common/mmo.h"
+ full;
+ short unchecked, unread;
+ struct mail_message msg[30];
+};
+
+struct auction_data {
+ unsigned int auction_id;
+ int seller_id;
+ char seller_name[(23 + 1)];
+ int buyer_id;
+ char buyer_name[(23 + 1)];
+
+ struct item item;
+
+ char item_name[50];
+ short type;
+
+ unsigned short hours;
+ int price, buynow;
+ time_t timestamp;
+ int auction_end_timer;
+};
+
+struct party_member {
+ int account_id;
+ int char_id;
+ char name[(23 + 1)];
+ unsigned short class_;
+ unsigned short map;
+ unsigned short lv;
+ unsigned leader : 1,
+ online : 1;
+};
+
+struct party {
+ int party_id;
+ char name[(23 + 1)];
+ unsigned char count;
+ unsigned exp : 1,
+ item : 2;
+ struct party_member member[12];
+};
+
+struct map_session_data;
+struct guild_member {
+ int account_id, char_id;
+ short hair,hair_color,gender,class_,lv;
+ uint64 exp;
+ int exp_payper;
+ short online,position;
+ char name[(23 + 1)];
+ struct map_session_data *sd;
+ unsigned char modified;
+};
+
+struct guild_position {
+ char name[(23 + 1)];
+ int mode;
+ int exp_mode;
+ unsigned char modified;
+};
+
+struct guild_alliance {
+ int opposition;
+ int guild_id;
+ char name[(23 + 1)];
+};
+
+struct guild_expulsion {
+ char name[(23 + 1)];
+ char mes[40];
+ int account_id;
+};
+
+struct guild_skill {
+ int id,lv;
+};
+
+struct channel_data;
+struct guild {
+ int guild_id;
+ short guild_lv, connect_member, max_member, average_lv;
+ uint64 exp;
+ unsigned int next_exp;
+ int skill_point;
+ char name[(23 + 1)],master[(23 + 1)];
+ struct guild_member member[(16 +10*6)];
+ struct guild_position position[20];
+ char mes1[60],mes2[120];
+ int emblem_len,emblem_id;
+ char emblem_data[2048];
+ struct guild_alliance alliance[16];
+ struct guild_expulsion expulsion[32];
+ struct guild_skill skill[15];
+
+
+ unsigned short save_flag;
+
+ short *instance;
+ unsigned short instances;
+
+ struct channel_data *channel;
+ struct hplugin_data_store *hdata;
+};
+
+struct guild_castle {
+ int castle_id;
+ int mapindex;
+ char castle_name[(23 + 1)];
+ char castle_event[(23 + 1)];
+ int guild_id;
+ int economy;
+ int defense;
+ int triggerE;
+ int triggerD;
+ int nextTime;
+ int payTime;
+ int createTime;
+ int visibleC;
+ struct {
+ unsigned visible : 1;
+ int id;
+ } guardian[8];
+ int* temp_guardians;
+ int temp_guardians_max;
+};
+
+struct fame_list {
+ int id;
+ int fame;
+ char name[(23 + 1)];
+};
+
+enum fame_list_type {
+ RANKTYPE_BLACKSMITH = 0,
+ RANKTYPE_ALCHEMIST = 1,
+ RANKTYPE_TAEKWON = 2,
+ RANKTYPE_PK = 3,
+};
+
+
+
+
+
+
+enum guild_basic_info {
+ GBI_EXP = 1,
+ GBI_GUILDLV,
+ GBI_SKILLPOINT,
+
+
+
+
+
+ GBI_SKILLLV,
+};
+
+enum {
+ GMI_POSITION = 0,
+ GMI_EXP,
+ GMI_HAIR,
+ GMI_HAIR_COLOR,
+ GMI_GENDER,
+ GMI_CLASS,
+ GMI_LEVEL,
+};
+
+enum guild_permission {
+ GPERM_INVITE = 0x01,
+ GPERM_EXPEL = 0x10,
+ GPERM_ALL = GPERM_INVITE|GPERM_EXPEL,
+ GPERM_MASK = GPERM_ALL,
+};
+
+enum {
+ GD_SKILLBASE=10000,
+ GD_APPROVAL=10000,
+ GD_KAFRACONTRACT=10001,
+ GD_GUARDRESEARCH=10002,
+ GD_GUARDUP=10003,
+ GD_EXTENSION=10004,
+ GD_GLORYGUILD=10005,
+ GD_LEADERSHIP=10006,
+ GD_GLORYWOUNDS=10007,
+ GD_SOULCOLD=10008,
+ GD_HAWKEYES=10009,
+ GD_BATTLEORDER=10010,
+ GD_REGENERATION=10011,
+ GD_RESTORE=10012,
+ GD_EMERGENCYCALL=10013,
+ GD_DEVELOPMENT=10014,
+ GD_MAX,
+};
+
+
+enum {
+ JOB_NOVICE,
+ JOB_SWORDMAN,
+ JOB_MAGE,
+ JOB_ARCHER,
+ JOB_ACOLYTE,
+ JOB_MERCHANT,
+ JOB_THIEF,
+ JOB_KNIGHT,
+ JOB_PRIEST,
+ JOB_WIZARD,
+ JOB_BLACKSMITH,
+ JOB_HUNTER,
+ JOB_ASSASSIN,
+ JOB_KNIGHT2,
+ JOB_CRUSADER,
+ JOB_MONK,
+ JOB_SAGE,
+ JOB_ROGUE,
+ JOB_ALCHEMIST,
+ JOB_BARD,
+ JOB_DANCER,
+ JOB_CRUSADER2,
+ JOB_WEDDING,
+ JOB_SUPER_NOVICE,
+ JOB_GUNSLINGER,
+ JOB_NINJA,
+ JOB_XMAS,
+ JOB_SUMMER,
+ JOB_MAX_BASIC,
+
+ JOB_NOVICE_HIGH = 4001,
+ JOB_SWORDMAN_HIGH,
+ JOB_MAGE_HIGH,
+ JOB_ARCHER_HIGH,
+ JOB_ACOLYTE_HIGH,
+ JOB_MERCHANT_HIGH,
+ JOB_THIEF_HIGH,
+ JOB_LORD_KNIGHT,
+ JOB_HIGH_PRIEST,
+ JOB_HIGH_WIZARD,
+ JOB_WHITESMITH,
+ JOB_SNIPER,
+ JOB_ASSASSIN_CROSS,
+ JOB_LORD_KNIGHT2,
+ JOB_PALADIN,
+ JOB_CHAMPION,
+ JOB_PROFESSOR,
+ JOB_STALKER,
+ JOB_CREATOR,
+ JOB_CLOWN,
+ JOB_GYPSY,
+ JOB_PALADIN2,
+
+ JOB_BABY,
+ JOB_BABY_SWORDMAN,
+ JOB_BABY_MAGE,
+ JOB_BABY_ARCHER,
+ JOB_BABY_ACOLYTE,
+ JOB_BABY_MERCHANT,
+ JOB_BABY_THIEF,
+ JOB_BABY_KNIGHT,
+ JOB_BABY_PRIEST,
+ JOB_BABY_WIZARD,
+ JOB_BABY_BLACKSMITH,
+ JOB_BABY_HUNTER,
+ JOB_BABY_ASSASSIN,
+ JOB_BABY_KNIGHT2,
+ JOB_BABY_CRUSADER,
+ JOB_BABY_MONK,
+ JOB_BABY_SAGE,
+ JOB_BABY_ROGUE,
+ JOB_BABY_ALCHEMIST,
+ JOB_BABY_BARD,
+ JOB_BABY_DANCER,
+ JOB_BABY_CRUSADER2,
+ JOB_SUPER_BABY,
+
+ JOB_TAEKWON,
+ JOB_STAR_GLADIATOR,
+ JOB_STAR_GLADIATOR2,
+ JOB_SOUL_LINKER,
+
+ JOB_GANGSI,
+ JOB_DEATH_KNIGHT,
+ JOB_DARK_COLLECTOR,
+
+ JOB_RUNE_KNIGHT = 4054,
+ JOB_WARLOCK,
+ JOB_RANGER,
+ JOB_ARCH_BISHOP,
+ JOB_MECHANIC,
+ JOB_GUILLOTINE_CROSS,
+
+ JOB_RUNE_KNIGHT_T,
+ JOB_WARLOCK_T,
+ JOB_RANGER_T,
+ JOB_ARCH_BISHOP_T,
+ JOB_MECHANIC_T,
+ JOB_GUILLOTINE_CROSS_T,
+
+ JOB_ROYAL_GUARD,
+ JOB_SORCERER,
+ JOB_MINSTREL,
+ JOB_WANDERER,
+ JOB_SURA,
+ JOB_GENETIC,
+ JOB_SHADOW_CHASER,
+
+ JOB_ROYAL_GUARD_T,
+ JOB_SORCERER_T,
+ JOB_MINSTREL_T,
+ JOB_WANDERER_T,
+ JOB_SURA_T,
+ JOB_GENETIC_T,
+ JOB_SHADOW_CHASER_T,
+
+ JOB_RUNE_KNIGHT2,
+ JOB_RUNE_KNIGHT_T2,
+ JOB_ROYAL_GUARD2,
+ JOB_ROYAL_GUARD_T2,
+ JOB_RANGER2,
+ JOB_RANGER_T2,
+ JOB_MECHANIC2,
+ JOB_MECHANIC_T2,
+
+ JOB_BABY_RUNE = 4096,
+ JOB_BABY_WARLOCK,
+ JOB_BABY_RANGER,
+ JOB_BABY_BISHOP,
+ JOB_BABY_MECHANIC,
+ JOB_BABY_CROSS,
+
+ JOB_BABY_GUARD,
+ JOB_BABY_SORCERER,
+ JOB_BABY_MINSTREL,
+ JOB_BABY_WANDERER,
+ JOB_BABY_SURA,
+ JOB_BABY_GENETIC,
+ JOB_BABY_CHASER,
+
+ JOB_BABY_RUNE2,
+ JOB_BABY_GUARD2,
+ JOB_BABY_RANGER2,
+ JOB_BABY_MECHANIC2,
+
+ JOB_SUPER_NOVICE_E = 4190,
+ JOB_SUPER_BABY_E,
+
+ JOB_KAGEROU = 4211,
+ JOB_OBORO,
+ JOB_REBELLION = 4215,
+
+ JOB_MAX,
+};
+
+
+
+
+enum {
+ SEX_FEMALE = 0,
+ SEX_MALE,
+ SEX_SERVER
+};
+
+enum weapon_type {
+ W_FIST,
+ W_DAGGER,
+ W_1HSWORD,
+ W_2HSWORD,
+ W_1HSPEAR,
+ W_2HSPEAR,
+ W_1HAXE,
+ W_2HAXE,
+ W_MACE,
+ W_2HMACE,
+ W_STAFF,
+ W_BOW,
+ W_KNUCKLE,
+ W_MUSICAL,
+ W_WHIP,
+ W_BOOK,
+ W_KATAR,
+ W_REVOLVER,
+ W_RIFLE,
+ W_GATLING,
+ W_SHOTGUN,
+ W_GRENADE,
+ W_HUUMA,
+ W_2HSTAFF,
+ MAX_SINGLE_WEAPON_TYPE,
+
+ W_DOUBLE_DD,
+ W_DOUBLE_SS,
+ W_DOUBLE_AA,
+ W_DOUBLE_DS,
+ W_DOUBLE_DA,
+ W_DOUBLE_SA,
+ MAX_WEAPON_TYPE,
+};
+
+enum ammo_type {
+ A_ARROW = 1,
+ A_DAGGER,
+ A_BULLET,
+ A_SHELL,
+ A_GRENADE,
+ A_SHURIKEN,
+ A_KUNAI,
+ A_CANNONBALL,
+ A_THROWWEAPON,
+};
+
+enum e_char_server_type {
+ CST_NORMAL = 0,
+ CST_MAINTENANCE = 1,
+ CST_OVER18 = 2,
+ CST_PAYING = 3,
+ CST_F2P = 4,
+};
+
+enum e_pc_reg_loading {
+ PRL_NONE = 0x0,
+ PRL_CHAR = 0x1,
+ PRL_ACCL = 0x2,
+ PRL_ACCG = 0x4,
+ PRL_ALL = 0xFF,
+};
+
+
+
+
+enum zh_char_ask_name_type {
+ CHAR_ASK_NAME_BLOCK = 1,
+ CHAR_ASK_NAME_BAN = 2,
+ CHAR_ASK_NAME_UNBLOCK = 3,
+ CHAR_ASK_NAME_UNBAN = 4,
+ CHAR_ASK_NAME_CHANGESEX = 5,
+ CHAR_ASK_NAME_CHARBAN = 6,
+ CHAR_ASK_NAME_CHARUNBAN = 7,
+ CHAR_ASK_NAME_CHANGECHARSEX = 8,
+};
+
+
+
+
+enum hz_char_ask_name_answer {
+ CHAR_ASK_NAME_ANS_DONE = 0,
+ CHAR_ASK_NAME_ANS_NOTFOUND = 1,
+ CHAR_ASK_NAME_ANS_GMLOW = 2,
+ CHAR_ASK_NAME_ANS_OFFLINE = 3,
+};
+# 28 "../../../server-code/src/char/char.h" 2
+
+enum E_CHARSERVER_ST {
+ CHARSERVER_ST_RUNNING = CORE_ST_LAST,
+ CHARSERVER_ST_SHUTDOWN,
+ CHARSERVER_ST_LAST
+};
+
+struct char_session_data {
+
+# 36 "../../../server-code/src/char/char.h" 3 4
+_Bool
+# 36 "../../../server-code/src/char/char.h"
+ auth;
+ int account_id, login_id1, login_id2, sex;
+ int found_char[9];
+ time_t unban_time[9];
+ char email[40];
+ time_t expiration_time;
+ int group_id;
+ uint8 char_slots;
+ uint32 version;
+ uint8 clienttype;
+ char pincode[4+1];
+ uint32 pincode_seed;
+ uint16 pincode_try;
+ uint32 pincode_change;
+ char new_name[(23 + 1)];
+ char birthdate[10+1];
+};
+
+struct online_char_data {
+ int account_id;
+ int char_id;
+ int fd;
+ int waiting_disconnect;
+ short server;
+ int pincode_enable;
+};
+
+struct mmo_map_server {
+ int fd;
+ uint32 ip;
+ uint16 port;
+ int users;
+ struct { int _max_; int _len_; uint16 *_data_; } maps;
+};
+
+
+
+
+
+enum inventory_table_type {
+ TABLE_INVENTORY,
+ TABLE_CART,
+ TABLE_STORAGE,
+ TABLE_GUILD_STORAGE,
+};
+
+struct char_auth_node {
+ int account_id;
+ int char_id;
+ uint32 login_id1;
+ uint32 login_id2;
+ uint32 ip;
+ int sex;
+ time_t expiration_time;
+ int group_id;
+ unsigned changing_mapservers : 1;
+};
+
+
+
+
+struct char_interface {
+ struct mmo_map_server server[2];
+ int login_fd;
+ int char_fd;
+ struct DBMap *online_char_db;
+ struct DBMap *char_db_;
+ char userid[(23 + 1)];
+ char passwd[(23 + 1)];
+ char server_name[20];
+ uint32 ip;
+ uint16 port;
+ int server_type;
+ int new_display;
+
+ char *CHAR_CONF_NAME;
+ char *NET_CONF_NAME;
+ char *SQL_CONF_NAME;
+ char *INTER_CONF_NAME;
+
+ int (*waiting_disconnect) (int tid, int64 tick, int id, intptr_t data);
+ int (*delete_char_sql) (int char_id);
+ struct DBData (*create_online_char_data) (union DBKey key, va_list args);
+ void (*set_account_online) (int account_id);
+ void (*set_account_offline) (int account_id);
+ void (*set_char_charselect) (int account_id);
+ void (*set_char_online) (int map_id, int char_id, int account_id);
+ void (*set_char_offline) (int char_id, int account_id);
+ int (*db_setoffline) (union DBKey key, struct DBData *data, va_list ap);
+ int (*db_kickoffline) (union DBKey key, struct DBData *data, va_list ap);
+ void (*set_login_all_offline) (void);
+ void (*set_all_offline) (int id);
+ void (*set_all_offline_sql) (void);
+ struct DBData (*create_charstatus) (union DBKey key, va_list args);
+ int (*mmo_char_tosql) (int char_id, struct mmo_charstatus* p);
+ int (*memitemdata_to_sql) (const struct item items[], int max, int id, int tableswitch);
+ int (*mmo_gender) (const struct char_session_data *sd, const struct mmo_charstatus *p, char sex);
+ int (*mmo_chars_fromsql) (struct char_session_data* sd, uint8* buf);
+ int (*mmo_char_fromsql) (int char_id, struct mmo_charstatus* p,
+# 134 "../../../server-code/src/char/char.h" 3 4
+ _Bool
+# 134 "../../../server-code/src/char/char.h"
+ load_everything);
+ int (*mmo_char_sql_init) (void);
+
+# 136 "../../../server-code/src/char/char.h" 3 4
+_Bool
+# 136 "../../../server-code/src/char/char.h"
+ (*char_slotchange) (struct char_session_data *sd, int fd, unsigned short from, unsigned short to);
+ int (*rename_char_sql) (struct char_session_data *sd, int char_id);
+ int (*check_char_name) (char * name, char * esc_name);
+ int (*make_new_char_sql) (struct char_session_data *sd, const char *name_, int str, int agi, int vit, int int_, int dex, int luk, int slot, int hair_color, int hair_style);
+ int (*divorce_char_sql) (int partner_id1, int partner_id2);
+ int (*count_users) (void);
+ int (*mmo_char_tobuf) (uint8* buffer, struct mmo_charstatus* p);
+ void (*mmo_char_send099d) (int fd, struct char_session_data *sd);
+ void (*mmo_char_send_ban_list) (int fd, struct char_session_data *sd);
+ void (*mmo_char_send_slots_info) (int fd, struct char_session_data* sd);
+ int (*mmo_char_send_characters) (int fd, struct char_session_data* sd);
+ int (*char_married) (int pl1, int pl2);
+ int (*char_child) (int parent_id, int child_id);
+ int (*char_family) (int cid1, int cid2, int cid3);
+ void (*disconnect_player) (int account_id);
+ void (*authfail_fd) (int fd, int type);
+ void (*request_account_data) (int account_id);
+ void (*auth_ok) (int fd, struct char_session_data *sd);
+ void (*ping_login_server) (int fd);
+ int (*parse_fromlogin_connection_state) (int fd);
+ void (*auth_error) (int fd, unsigned char flag);
+ void (*parse_fromlogin_auth_state) (int fd);
+ void (*parse_fromlogin_account_data) (int fd);
+ void (*parse_fromlogin_login_pong) (int fd);
+ void (*changesex) (int account_id, int sex);
+ int (*parse_fromlogin_changesex_reply) (int fd);
+ void (*parse_fromlogin_account_reg2) (int fd);
+ void (*parse_fromlogin_ban) (int fd);
+ void (*parse_fromlogin_kick) (int fd);
+ void (*update_ip) (int fd);
+ void (*parse_fromlogin_update_ip) (int fd);
+ void (*parse_fromlogin_accinfo2_failed) (int fd);
+ void (*parse_fromlogin_accinfo2_ok) (int fd);
+ int (*parse_fromlogin) (int fd);
+ int (*request_accreg2) (int account_id, int char_id);
+ void (*global_accreg_to_login_start) (int account_id, int char_id);
+ void (*global_accreg_to_login_send) (void);
+ void (*global_accreg_to_login_add) (const char *key, unsigned int index, intptr_t val,
+# 173 "../../../server-code/src/char/char.h" 3 4
+ _Bool
+# 173 "../../../server-code/src/char/char.h"
+ is_string);
+ void (*read_fame_list) (void);
+ int (*send_fame_list) (int fd);
+ void (*update_fame_list) (int type, int index, int fame);
+ int (*loadName) (int char_id, char* name);
+ void (*parse_frommap_datasync) (int fd);
+ void (*parse_frommap_skillid2idx) (int fd);
+ void (*map_received_ok) (int fd);
+ void (*send_maps) (int fd, int id, int j);
+ void (*parse_frommap_map_names) (int fd, int id);
+ void (*send_scdata) (int fd, int aid, int cid);
+ void (*parse_frommap_request_scdata) (int fd);
+ void (*parse_frommap_set_users_count) (int fd, int id);
+ void (*parse_frommap_set_users) (int fd, int id);
+ void (*save_character_ack) (int fd, int aid, int cid);
+ void (*parse_frommap_save_character) (int fd, int id);
+ void (*select_ack) (int fd, int account_id, uint8 flag);
+ void (*parse_frommap_char_select_req) (int fd);
+ void (*change_map_server_ack) (int fd, const uint8 *data,
+# 191 "../../../server-code/src/char/char.h" 3 4
+ _Bool
+# 191 "../../../server-code/src/char/char.h"
+ ok);
+ void (*parse_frommap_change_map_server) (int fd);
+ void (*parse_frommap_remove_friend) (int fd);
+ void (*char_name_ack) (int fd, int char_id);
+ void (*parse_frommap_char_name_request) (int fd);
+ void (*parse_frommap_change_email) (int fd);
+ void (*ban) (int account_id, int char_id, time_t *unban_time, short year, short month, short day, short hour, short minute, short second);
+ void (*unban) (int char_id, int *result);
+ void (*ask_name_ack) (int fd, int acc, const char* name, int type, int result);
+ int (*changecharsex) (int char_id, int sex);
+ void (*parse_frommap_change_account) (int fd);
+ void (*parse_frommap_fame_list) (int fd);
+ void (*parse_frommap_divorce_char) (int fd);
+ void (*parse_frommap_ragsrvinfo) (int fd);
+ void (*parse_frommap_set_char_offline) (int fd);
+ void (*parse_frommap_set_all_offline) (int fd, int id);
+ void (*parse_frommap_set_char_online) (int fd, int id);
+ void (*parse_frommap_build_fame_list) (int fd);
+ void (*parse_frommap_save_status_change_data) (int fd);
+ void (*send_pong) (int fd);
+ void (*parse_frommap_ping) (int fd);
+ void (*map_auth_ok) (int fd, int account_id, struct char_auth_node* node, struct mmo_charstatus* cd);
+ void (*map_auth_failed) (int fd, int account_id, int char_id, int login_id1, char sex, uint32 ip);
+ void (*parse_frommap_auth_request) (int fd, int id);
+ void (*parse_frommap_update_ip) (int fd, int id);
+ void (*parse_frommap_request_stats_report) (int fd);
+ void (*parse_frommap_scdata_update) (int fd);
+ void (*parse_frommap_scdata_delete) (int fd);
+ int (*parse_frommap) (int fd);
+ int (*search_mapserver) (unsigned short map, uint32 ip, uint16 port);
+ int (*mapif_init) (int fd);
+ uint32 (*lan_subnet_check) (uint32 ip);
+ void (*delete2_ack) (int fd, int char_id, uint32 result, time_t delete_date);
+ void (*delete2_accept_actual_ack) (int fd, int char_id, uint32 result);
+ void (*delete2_accept_ack) (int fd, int char_id, uint32 result);
+ void (*delete2_cancel_ack) (int fd, int char_id, uint32 result);
+ void (*delete2_req) (int fd, struct char_session_data* sd);
+ void (*delete2_accept) (int fd, struct char_session_data* sd);
+ void (*delete2_cancel) (int fd, struct char_session_data* sd);
+ void (*send_account_id) (int fd, int account_id);
+ void (*parse_char_connect) (int fd, struct char_session_data* sd, uint32 ipl);
+ void (*send_map_info) (int fd, int i, uint32 subnet_map_ip, struct mmo_charstatus *cd);
+ void (*send_wait_char_server) (int fd);
+ int (*search_default_maps_mapserver) (struct mmo_charstatus *cd);
+ void (*parse_char_select) (int fd, struct char_session_data* sd, uint32 ipl);
+ void (*creation_failed) (int fd, int result);
+ void (*creation_ok) (int fd, struct mmo_charstatus *char_dat);
+ void (*parse_char_create_new_char) (int fd, struct char_session_data* sd);
+ void (*delete_char_failed) (int fd, int flag);
+ void (*delete_char_ok) (int fd);
+ void (*parse_char_delete_char) (int fd, struct char_session_data* sd, unsigned short cmd);
+ void (*parse_char_ping) (int fd);
+ void (*allow_rename) (int fd, int flag);
+ void (*parse_char_rename_char) (int fd, struct char_session_data* sd);
+ void (*parse_char_rename_char2) (int fd, struct char_session_data* sd);
+ void (*rename_char_ack) (int fd, int flag);
+ void (*parse_char_rename_char_confirm) (int fd, struct char_session_data* sd);
+ void (*captcha_notsupported) (int fd);
+ void (*parse_char_request_captcha) (int fd);
+ void (*parse_char_check_captcha) (int fd);
+ void (*parse_char_delete2_req) (int fd, struct char_session_data* sd);
+ void (*parse_char_delete2_accept) (int fd, struct char_session_data* sd);
+ void (*parse_char_delete2_cancel) (int fd, struct char_session_data* sd);
+ void (*login_map_server_ack) (int fd, uint8 flag);
+ void (*parse_char_login_map_server) (int fd, uint32 ipl);
+ void (*parse_char_pincode_check) (int fd, struct char_session_data* sd);
+ void (*parse_char_pincode_window) (int fd, struct char_session_data* sd);
+ void (*parse_char_pincode_change) (int fd, struct char_session_data* sd);
+ void (*parse_char_pincode_first_pin) (int fd, struct char_session_data* sd);
+ void (*parse_char_request_chars) (int fd, struct char_session_data* sd);
+ void (*change_character_slot_ack) (int fd,
+# 261 "../../../server-code/src/char/char.h" 3 4
+ _Bool
+# 261 "../../../server-code/src/char/char.h"
+ ret);
+ void (*parse_char_move_character) (int fd, struct char_session_data* sd);
+ int (*parse_char_unknown_packet) (int fd, uint32 ipl);
+ int (*parse_char) (int fd);
+ int (*broadcast_user_count) (int tid, int64 tick, int id, intptr_t data);
+ int (*send_accounts_tologin_sub) (union DBKey key, struct DBData *data, va_list ap);
+ int (*send_accounts_tologin) (int tid, int64 tick, int id, intptr_t data);
+ int (*check_connect_login_server) (int tid, int64 tick, int id, intptr_t data);
+ int (*online_data_cleanup_sub) (union DBKey key, struct DBData *data, va_list ap);
+ int (*online_data_cleanup) (int tid, int64 tick, int id, intptr_t data);
+ void (*sql_config_read) (const char* cfgName);
+ void (*config_dispatch) (char *w1, char *w2);
+ int (*config_read) (const char* cfgName);
+};
+
+
+extern int char_name_option;
+extern char char_name_letters[];
+extern
+# 279 "../../../server-code/src/char/char.h" 3 4
+ _Bool
+# 279 "../../../server-code/src/char/char.h"
+ char_gm_read;
+extern int autosave_interval;
+extern int save_log;
+extern char db_path[];
+extern char char_db[256];
+extern char scdata_db[256];
+extern char cart_db[256];
+extern char inventory_db[256];
+extern char charlog_db[256];
+extern char storage_db[256];
+extern char interlog_db[256];
+extern char skill_db[256];
+extern char memo_db[256];
+extern char guild_db[256];
+extern char guild_alliance_db[256];
+extern char guild_castle_db[256];
+extern char guild_expulsion_db[256];
+extern char guild_member_db[256];
+extern char guild_position_db[256];
+extern char guild_skill_db[256];
+extern char guild_storage_db[256];
+extern char party_db[256];
+extern char pet_db[256];
+extern char mail_db[256];
+extern char auction_db[256];
+extern char quest_db[256];
+extern char homunculus_db[256];
+extern char skill_homunculus_db[256];
+extern char mercenary_db[256];
+extern char mercenary_owner_db[256];
+extern char ragsrvinfo_db[256];
+extern char elemental_db[256];
+extern char acc_reg_num_db[32];
+extern char acc_reg_str_db[32];
+extern char char_reg_str_db[32];
+extern char char_reg_num_db[32];
+
+extern int guild_exp_rate;
+extern int log_inter;
+
+void char_load_defaults(void);
+void char_defaults(void);
+
+
+extern struct char_interface *chr;
+# 25 "../../../server-code/src/char/char.c" 2
+
+# 1 "../../../server-code/src/char/HPMchar.h" 1
+# 28 "../../../server-code/src/char/HPMchar.h"
+# 1 "../../../server-code/src/common/HPM.h" 1
+# 29 "../../../server-code/src/common/HPM.h"
+# 1 "../../../server-code/src/common/HPMi.h" 1
+# 24 "../../../server-code/src/common/HPMi.h"
+# 1 "../../../server-code/src/common/console.h" 1
+# 25 "../../../server-code/src/common/console.h"
+# 1 "../../../server-code/src/common/mutex.h" 1
+# 26 "../../../server-code/src/common/mutex.h"
+typedef struct ramutex ramutex;
+typedef struct racond racond;
+
+
+
+
+
+
+
+ramutex *ramutex_create(void);
+
+
+
+
+
+
+void ramutex_destroy(ramutex *m);
+
+
+
+
+
+
+void ramutex_lock(ramutex *m);
+# 58 "../../../server-code/src/common/mutex.h"
+
+# 58 "../../../server-code/src/common/mutex.h" 3 4
+_Bool
+# 58 "../../../server-code/src/common/mutex.h"
+ ramutex_trylock(ramutex *m);
+
+
+
+
+
+
+void ramutex_unlock(ramutex *m);
+
+
+
+
+
+
+
+racond *racond_create(void);
+
+
+
+
+
+
+void racond_destroy(racond *c);
+# 89 "../../../server-code/src/common/mutex.h"
+void racond_wait(racond *c, ramutex *m, sysint timeout_ticks);
+# 99 "../../../server-code/src/common/mutex.h"
+void racond_signal(racond *c);
+# 108 "../../../server-code/src/common/mutex.h"
+void racond_broadcast(racond *c);
+# 26 "../../../server-code/src/common/console.h" 2
+# 1 "../../../server-code/src/common/spinlock.h" 1
+# 31 "../../../server-code/src/common/spinlock.h"
+# 1 "../../../server-code/src/common/atomic.h" 1
+# 110 "../../../server-code/src/common/atomic.h"
+static __attribute__((always_inline)) inline int64 InterlockedExchangeAdd64(volatile int64 *addend, int64 increment){
+ return __sync_fetch_and_add(addend, increment);
+}
+
+static __attribute__((always_inline)) inline int32 InterlockedExchangeAdd(volatile int32 *addend, int32 increment){
+ return __sync_fetch_and_add(addend, increment);
+}
+
+static __attribute__((always_inline)) inline int64 InterlockedIncrement64(volatile int64 *addend){
+ return __sync_add_and_fetch(addend, 1);
+}
+
+static __attribute__((always_inline)) inline int32 InterlockedIncrement(volatile int32 *addend){
+ return __sync_add_and_fetch(addend, 1);
+}
+
+static __attribute__((always_inline)) inline int64 InterlockedDecrement64(volatile int64 *addend){
+ return __sync_sub_and_fetch(addend, 1);
+}
+
+static __attribute__((always_inline)) inline int32 InterlockedDecrement(volatile int32 *addend){
+ return __sync_sub_and_fetch(addend, 1);
+}
+
+static __attribute__((always_inline)) inline int64 InterlockedCompareExchange64(volatile int64 *dest, int64 exch, int64 cmp){
+ return __sync_val_compare_and_swap(dest, cmp, exch);
+}
+
+static __attribute__((always_inline)) inline int32 InterlockedCompareExchange(volatile int32 *dest, int32 exch, int32 cmp){
+ return __sync_val_compare_and_swap(dest, cmp, exch);
+}
+
+static __attribute__((always_inline)) inline int64 InterlockedExchange64(volatile int64 *target, int64 val){
+ return __sync_lock_test_and_set(target, val);
+}
+
+static __attribute__((always_inline)) inline int32 InterlockedExchange(volatile int32 *target, int32 val){
+ return __sync_lock_test_and_set(target, val);
+}
+# 32 "../../../server-code/src/common/spinlock.h" 2
+
+# 1 "../../../server-code/src/common/thread.h" 1
+# 26 "../../../server-code/src/common/thread.h"
+typedef struct rAthread rAthread;
+typedef void* (*rAthreadProc)(void*);
+
+typedef enum RATHREAD_PRIO {
+ RAT_PRIO_LOW = 0,
+ RAT_PRIO_NORMAL,
+ RAT_PRIO_HIGH
+} RATHREAD_PRIO;
+# 45 "../../../server-code/src/common/thread.h"
+rAthread *rathread_create(rAthreadProc entryPoint, void *param);
+# 58 "../../../server-code/src/common/thread.h"
+rAthread *rathread_createEx(rAthreadProc entryPoint, void *param, size_t szStack, RATHREAD_PRIO prio);
+# 68 "../../../server-code/src/common/thread.h"
+void rathread_destroy(rAthread *handle);
+# 79 "../../../server-code/src/common/thread.h"
+rAthread *rathread_self(void);
+# 90 "../../../server-code/src/common/thread.h"
+int rathread_get_tid(void);
+# 101 "../../../server-code/src/common/thread.h"
+
+# 101 "../../../server-code/src/common/thread.h" 3 4
+_Bool
+# 101 "../../../server-code/src/common/thread.h"
+ rathread_wait(rAthread *handle, void **out_exitCode);
+# 110 "../../../server-code/src/common/thread.h"
+void rathread_prio_set(rAthread *handle, RATHREAD_PRIO prio);
+
+
+
+
+
+
+
+RATHREAD_PRIO rathread_prio_get(rAthread *handle);
+# 128 "../../../server-code/src/common/thread.h"
+void rathread_yield(void);
+
+void rathread_init(void);
+void rathread_final(void);
+# 34 "../../../server-code/src/common/spinlock.h" 2
+# 47 "../../../server-code/src/common/spinlock.h"
+typedef struct SPIN_LOCK{
+ volatile int32 lock;
+ volatile int32 nest;
+
+ volatile int32 sync_lock;
+} __attribute__((aligned(64))) SPIN_LOCK;
+
+
+
+
+static __attribute__((always_inline)) inline void InitializeSpinLock(SPIN_LOCK *lck){
+ lck->lock = 0;
+ lck->nest = 0;
+ lck->sync_lock = 0;
+}
+
+static __attribute__((always_inline)) inline void FinalizeSpinLock(SPIN_LOCK *lck){
+ return;
+}
+
+
+
+
+
+static __attribute__((always_inline)) inline void EnterSpinLock(SPIN_LOCK *lck){
+ int tid = rathread_get_tid();
+
+
+
+ do { if(InterlockedCompareExchange((&lck->sync_lock), 1, 0) == 0) break; rathread_yield(); } while( 1);
+ if(InterlockedCompareExchange(&lck->lock, tid, tid) == tid){
+ InterlockedIncrement(&lck->nest);
+ do { InterlockedExchange((&lck->sync_lock), 0); } while(0);
+ return;
+ }
+
+ do { InterlockedExchange((&lck->sync_lock), 0); } while(0);
+
+
+ while(1){
+ if(InterlockedCompareExchange(&lck->lock, tid, 0) == 0){
+ InterlockedIncrement(&lck->nest);
+ return;
+ }
+ rathread_yield();
+ }
+
+}
+
+
+static __attribute__((always_inline)) inline void LeaveSpinLock(SPIN_LOCK *lck){
+ int tid = rathread_get_tid();
+
+ do { if(InterlockedCompareExchange((&lck->sync_lock), 1, 0) == 0) break; rathread_yield(); } while( 1);
+
+ if(InterlockedCompareExchange(&lck->lock, tid, tid) == tid){
+ if(InterlockedDecrement(&lck->nest) == 0)
+ InterlockedExchange(&lck->lock, 0);
+ }
+
+ do { InterlockedExchange((&lck->sync_lock), 0); } while(0);
+}
+# 27 "../../../server-code/src/common/console.h" 2
+
+
+
+struct Sql;
+# 41 "../../../server-code/src/common/console.h"
+typedef void (*CParseFunc)(char *line);
+# 56 "../../../server-code/src/common/console.h"
+enum CONSOLE_PARSE_ENTRY_TYPE {
+ CPET_UNKNOWN,
+ CPET_FUNCTION,
+ CPET_CATEGORY,
+};
+
+struct CParseEntry {
+ char cmd[20];
+ int type;
+ union {
+ CParseFunc func;
+ struct { int _max_; int _len_; struct CParseEntry * *_data_; } children;
+ } u;
+};
+
+struct console_input_interface {
+
+
+ SPIN_LOCK ptlock;
+ rAthread *pthread;
+ volatile int32 ptstate;
+ ramutex *ptmutex;
+ racond *ptcond;
+
+ struct { int _max_; int _len_; struct CParseEntry * *_data_; } command_list;
+ struct { int _max_; int _len_; struct CParseEntry * *_data_; } commands;
+
+ struct Sql *SQL;
+
+ void (*parse_init) (void);
+ void (*parse_final) (void);
+ int (*parse_timer) (int tid, int64 tick, int id, intptr_t data);
+ void *(*pthread_main) (void *x);
+ void (*parse) (char* line);
+ void (*parse_sub) (char* line);
+ int (*key_pressed) (void);
+ void (*load_defaults) (void);
+ void (*parse_list_subs) (struct CParseEntry *cmd, unsigned char depth);
+ void (*addCommand) (char *name, CParseFunc func);
+ void (*setSQL) (struct Sql *SQL_handle);
+
+
+
+};
+
+struct console_interface {
+ void (*init) (void);
+ void (*final) (void);
+ void (*display_title) (void);
+ void (*display_gplnotice) (void);
+
+ struct console_input_interface *input;
+};
+
+
+void console_defaults(void);
+
+
+extern struct console_interface *console;
+# 25 "../../../server-code/src/common/HPMi.h" 2
+
+# 1 "../../../server-code/src/common/showmsg.h" 1
+# 29 "../../../server-code/src/common/showmsg.h"
+struct config_setting_t;
+# 89 "../../../server-code/src/common/showmsg.h"
+enum msg_type {
+ MSG_NONE,
+ MSG_STATUS,
+ MSG_SQL,
+ MSG_INFORMATION,
+ MSG_NOTICE,
+ MSG_WARNING,
+ MSG_DEBUG,
+ MSG_ERROR,
+ MSG_FATALERROR
+};
+
+struct showmsg_interface {
+
+# 102 "../../../server-code/src/common/showmsg.h" 3 4
+_Bool
+# 102 "../../../server-code/src/common/showmsg.h"
+ stdout_with_ansisequence;
+ int silent;
+ int console_log;
+ char timestamp_format[20];
+
+ void (*init) (void);
+ void (*final) (void);
+
+ void (*clearScreen) (void);
+ int (*showMessageV) (const char *string, va_list ap);
+
+ void (*showMessage) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showStatus) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showSQL) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showInfo) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showNotice) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showWarning) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showDebug) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showError) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showFatalError) (const char *, ...) __attribute__((format(printf, 1, 2)));
+ void (*showConfigWarning) (struct config_setting_t *config, const char *string, ...) __attribute__((format(printf, 2, 3)));
+};
+# 140 "../../../server-code/src/common/showmsg.h"
+void showmsg_defaults(void);
+
+
+extern struct showmsg_interface *showmsg;
+# 27 "../../../server-code/src/common/HPMi.h" 2
+
+struct Sql;
+struct script_state;
+struct AtCommandInfo;
+struct socket_data;
+struct map_session_data;
+struct hplugin_data_store;
+
+
+
+
+struct hplugin_info {
+ char* name;
+ enum server_types type;
+ char* version;
+ char* req_version;
+};
+
+struct s_HPMDataCheck {
+ char *name;
+ unsigned int size;
+ int type;
+};
+
+
+
+enum hp_event_types {
+ HPET_INIT,
+ HPET_FINAL,
+ HPET_READY,
+ HPET_POST_FINAL,
+ HPET_PRE_INIT,
+ HPET_MAX,
+};
+
+enum HPluginPacketHookingPoints {
+ hpClif_Parse,
+ hpChrif_Parse,
+ hpParse_FromMap,
+ hpParse_FromLogin,
+ hpParse_Char,
+ hpParse_FromChar,
+ hpParse_Login,
+
+ hpPHP_MAX,
+};
+
+enum HPluginHookType {
+ HOOK_TYPE_PRE,
+ HOOK_TYPE_POST,
+};
+
+
+
+
+enum HPluginDataTypes {
+ HPDT_UNKNOWN,
+ HPDT_SESSION,
+ HPDT_MSD,
+ HPDT_NPCD,
+ HPDT_MAP,
+ HPDT_INSTANCE,
+ HPDT_GUILD,
+ HPDT_PARTY,
+ HPDT_MOBDB,
+ HPDT_MOBDATA,
+ HPDT_ITEMDATA,
+ HPDT_BGDATA,
+ HPDT_AUTOTRADE_VEND,
+};
+
+
+enum HPluginConfType {
+ HPCT_BATTLE,
+ HPCT_LOGIN,
+ HPCT_CHAR,
+ HPCT_CHAR_INTER,
+ HPCT_MAP_INTER,
+ HPCT_LOG,
+ HPCT_SCRIPT,
+ HPCT_MAX,
+};
+# 220 "../../../server-code/src/common/HPMi.h"
+struct HPMi_interface {
+
+ unsigned int pid;
+
+ void (*event[HPET_MAX]) (void);
+
+# 225 "../../../server-code/src/common/HPMi.h" 3 4
+_Bool
+# 225 "../../../server-code/src/common/HPMi.h"
+ (*addCommand) (char *name,
+# 225 "../../../server-code/src/common/HPMi.h" 3 4
+ _Bool
+# 225 "../../../server-code/src/common/HPMi.h"
+ (*func)(const int fd, struct map_session_data* sd, const char* command, const char* message,struct AtCommandInfo *info));
+
+# 226 "../../../server-code/src/common/HPMi.h" 3 4
+_Bool
+# 226 "../../../server-code/src/common/HPMi.h"
+ (*addScript) (char *name, char *args,
+# 226 "../../../server-code/src/common/HPMi.h" 3 4
+ _Bool
+# 226 "../../../server-code/src/common/HPMi.h"
+ (*func)(struct script_state *st),
+# 226 "../../../server-code/src/common/HPMi.h" 3 4
+ _Bool
+# 226 "../../../server-code/src/common/HPMi.h"
+ isDeprecated);
+ void (*addCPCommand) (char *name, CParseFunc func);
+
+ void (*addToHPData) (enum HPluginDataTypes type, uint32 pluginID, struct hplugin_data_store **storeptr, void *data, uint32 classid,
+# 229 "../../../server-code/src/common/HPMi.h" 3 4
+ _Bool
+# 229 "../../../server-code/src/common/HPMi.h"
+ autofree);
+ void *(*getFromHPData) (enum HPluginDataTypes type, uint32 pluginID, struct hplugin_data_store *store, uint32 classid);
+ void (*removeFromHPData) (enum HPluginDataTypes type, uint32 pluginID, struct hplugin_data_store *store, uint32 classid);
+
+
+# 233 "../../../server-code/src/common/HPMi.h" 3 4
+_Bool
+# 233 "../../../server-code/src/common/HPMi.h"
+ (*addPacket) (unsigned short cmd, unsigned short length, void (*receive)(int fd), unsigned int point, unsigned int pluginID);
+
+
+# 235 "../../../server-code/src/common/HPMi.h" 3 4
+_Bool
+# 235 "../../../server-code/src/common/HPMi.h"
+ (*AddHook) (enum HPluginHookType type, const char *target, void *hook, unsigned int pID);
+ void (*HookStop) (const char *func, unsigned int pID);
+
+# 237 "../../../server-code/src/common/HPMi.h" 3 4
+_Bool
+# 237 "../../../server-code/src/common/HPMi.h"
+ (*HookStopped) (void);
+
+
+# 239 "../../../server-code/src/common/HPMi.h" 3 4
+_Bool
+# 239 "../../../server-code/src/common/HPMi.h"
+ (*addArg) (unsigned int pluginID, char *name,
+# 239 "../../../server-code/src/common/HPMi.h" 3 4
+ _Bool
+# 239 "../../../server-code/src/common/HPMi.h"
+ has_param, CmdlineExecFunc func, const char *help);
+
+
+# 241 "../../../server-code/src/common/HPMi.h" 3 4
+_Bool
+# 241 "../../../server-code/src/common/HPMi.h"
+ (*addConf) (unsigned int pluginID, enum HPluginConfType type, char *name, void (*parse_func) (const char *key, const char *val), int (*return_func) (const char *key));
+
+ void (*addPCGPermission) (unsigned int pluginID, char *name, unsigned int *mask);
+
+ struct Sql *sql_handle;
+};
+# 30 "../../../server-code/src/common/HPM.h" 2
+# 44 "../../../server-code/src/common/HPM.h"
+# 1 "/usr/include/dlfcn.h" 1 3 4
+# 24 "/usr/include/dlfcn.h" 3 4
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 25 "/usr/include/dlfcn.h" 2 3 4
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/dlfcn.h" 1 3 4
+# 28 "/usr/include/dlfcn.h" 2 3 4
+# 52 "/usr/include/dlfcn.h" 3 4
+
+
+
+
+
+# 56 "/usr/include/dlfcn.h" 3 4
+extern void *dlopen (const char *__file, int __mode) __attribute__ ((__nothrow__));
+
+
+
+extern int dlclose (void *__handle) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+extern void *dlsym (void *__restrict __handle,
+ const char *__restrict __name) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+# 82 "/usr/include/dlfcn.h" 3 4
+extern char *dlerror (void) __attribute__ ((__nothrow__ , __leaf__));
+# 188 "/usr/include/dlfcn.h" 3 4
+
+# 45 "../../../server-code/src/common/HPM.h" 2
+# 64 "../../../server-code/src/common/HPM.h"
+# 1 "/usr/include/string.h" 1 3 4
+# 27 "/usr/include/string.h" 3 4
+
+
+
+
+
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 33 "/usr/include/string.h" 2 3 4
+
+
+
+
+
+
+
+
+
+extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
+ size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern void *memmove (void *__dest, const void *__src, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+
+
+extern void *memccpy (void *__restrict __dest, const void *__restrict __src,
+ int __c, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+
+extern void *memset (void *__s, int __c, size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern int memcmp (const void *__s1, const void *__s2, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+# 92 "/usr/include/string.h" 3 4
+extern void *memchr (const void *__s, int __c, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+
+
+# 123 "/usr/include/string.h" 3 4
+
+
+extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+extern char *strncpy (char *__restrict __dest,
+ const char *__restrict __src, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern char *strcat (char *__restrict __dest, const char *__restrict __src)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+extern char *strncat (char *__restrict __dest, const char *__restrict __src,
+ size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern int strcmp (const char *__s1, const char *__s2)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+
+extern int strncmp (const char *__s1, const char *__s2, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern int strcoll (const char *__s1, const char *__s2)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+
+extern size_t strxfrm (char *__restrict __dest,
+ const char *__restrict __src, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+
+# 162 "/usr/include/string.h" 3 4
+extern int strcoll_l (const char *__s1, const char *__s2, __locale_t __l)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3)));
+
+extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n,
+ __locale_t __l) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 4)));
+
+
+
+
+extern char *strdup (const char *__s)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+extern char *strndup (const char *__string, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1)));
+# 206 "/usr/include/string.h" 3 4
+
+# 231 "/usr/include/string.h" 3 4
+extern char *strchr (const char *__s, int __c)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+# 258 "/usr/include/string.h" 3 4
+extern char *strrchr (const char *__s, int __c)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+
+
+# 277 "/usr/include/string.h" 3 4
+
+
+
+extern size_t strcspn (const char *__s, const char *__reject)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern size_t strspn (const char *__s, const char *__accept)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+# 310 "/usr/include/string.h" 3 4
+extern char *strpbrk (const char *__s, const char *__accept)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+# 337 "/usr/include/string.h" 3 4
+extern char *strstr (const char *__haystack, const char *__needle)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+extern char *strtok (char *__restrict __s, const char *__restrict __delim)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+
+
+
+
+extern char *__strtok_r (char *__restrict __s,
+ const char *__restrict __delim,
+ char **__restrict __save_ptr)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 3)));
+
+extern char *strtok_r (char *__restrict __s, const char *__restrict __delim,
+ char **__restrict __save_ptr)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 3)));
+# 392 "/usr/include/string.h" 3 4
+
+
+extern size_t strlen (const char *__s)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+extern size_t strnlen (const char *__string, size_t __maxlen)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+extern char *strerror (int __errnum) __attribute__ ((__nothrow__ , __leaf__));
+
+# 422 "/usr/include/string.h" 3 4
+extern int strerror_r (int __errnum, char *__buf, size_t __buflen) __asm__ ("" "__xpg_strerror_r") __attribute__ ((__nothrow__ , __leaf__))
+
+ __attribute__ ((__nonnull__ (2)));
+# 440 "/usr/include/string.h" 3 4
+extern char *strerror_l (int __errnum, __locale_t __l) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern void __bzero (void *__s, size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+extern void bcopy (const void *__src, void *__dest, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern void bzero (void *__s, size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern int bcmp (const void *__s1, const void *__s2, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+# 484 "/usr/include/string.h" 3 4
+extern char *index (const char *__s, int __c)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+# 512 "/usr/include/string.h" 3 4
+extern char *rindex (const char *__s, int __c)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+extern int ffs (int __i) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+# 529 "/usr/include/string.h" 3 4
+extern int strcasecmp (const char *__s1, const char *__s2)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern int strncasecmp (const char *__s1, const char *__s2, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
+# 552 "/usr/include/string.h" 3 4
+extern char *strsep (char **__restrict __stringp,
+ const char *__restrict __delim)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+extern char *strsignal (int __sig) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern char *__stpcpy (char *__restrict __dest, const char *__restrict __src)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+extern char *stpcpy (char *__restrict __dest, const char *__restrict __src)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+extern char *__stpncpy (char *__restrict __dest,
+ const char *__restrict __src, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+extern char *stpncpy (char *__restrict __dest,
+ const char *__restrict __src, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+# 639 "/usr/include/string.h" 3 4
+
+# 65 "../../../server-code/src/common/HPM.h" 2
+
+
+
+
+# 68 "../../../server-code/src/common/HPM.h"
+struct hplugin {
+ void * dll;
+ unsigned int idx;
+ char *filename;
+ struct hplugin_info *info;
+ struct HPMi_interface *hpi;
+};
+
+
+
+
+struct hpm_symbol {
+ const char *name;
+ void *ptr;
+};
+
+
+
+
+struct hplugin_data_entry {
+ uint32 pluginID;
+ uint32 classid;
+ struct {
+ unsigned int free : 1;
+ } flag;
+ void *data;
+};
+
+
+
+
+struct hplugin_data_store {
+ enum HPluginDataTypes type;
+ struct { int _max_; int _len_; struct hplugin_data_entry * *_data_; } entries;
+};
+
+struct HPluginPacket {
+ unsigned int pluginID;
+ unsigned short cmd;
+ short len;
+ void (*receive) (int fd);
+};
+
+struct HPMFileNameCache {
+ const char *addr;
+ char *name;
+};
+
+
+struct HPConfListenStorage {
+ unsigned int pluginID;
+ char key[40];
+ void (*parse_func) (const char *key, const char *val);
+ int (*return_func) (const char *key);
+};
+
+
+struct HPM_interface {
+
+ unsigned int version[2];
+
+# 128 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 128 "../../../server-code/src/common/HPM.h"
+ off;
+
+# 129 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 129 "../../../server-code/src/common/HPM.h"
+ hooking;
+
+
+# 131 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 131 "../../../server-code/src/common/HPM.h"
+ force_return;
+
+ struct { int _max_; int _len_; struct hplugin * *_data_; } plugins;
+ struct { int _max_; int _len_; struct hpm_symbol * *_data_; } symbols;
+
+ struct { int _max_; int _len_; struct HPluginPacket *_data_; } packets[hpPHP_MAX];
+
+ struct {
+
+ int count;
+ struct HPMFileNameCache *data;
+ } filenames;
+
+ struct { int _max_; int _len_; struct HPConfListenStorage *_data_; } config_listeners[HPCT_MAX];
+
+ struct { int _max_; int _len_; char * *_data_; } cmdline_load_plugins;
+
+ void (*init) (void);
+ void (*final) (void);
+ struct hplugin * (*create) (void);
+ struct hplugin * (*load) (const char* filename);
+ void (*unload) (struct hplugin* plugin);
+
+# 153 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 153 "../../../server-code/src/common/HPM.h"
+ (*exists) (const char *filename);
+
+# 154 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 154 "../../../server-code/src/common/HPM.h"
+ (*iscompatible) (char* version);
+ void (*event) (enum hp_event_types type);
+ void *(*import_symbol) (char *name, unsigned int pID);
+ void (*share) (void *value, const char *name);
+ void (*config_read) (void);
+ char *(*pid2name) (unsigned int pid);
+ unsigned char (*parse_packets) (int fd, int packet_id, enum HPluginPacketHookingPoints point);
+ void (*load_sub) (struct hplugin *plugin);
+
+# 162 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 162 "../../../server-code/src/common/HPM.h"
+ (*addhook_sub) (enum HPluginHookType type, const char *target, void *hook, unsigned int pID);
+
+
+# 164 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 164 "../../../server-code/src/common/HPM.h"
+ (*parseConf) (const char *w1, const char *w2, enum HPluginConfType point);
+
+# 165 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 165 "../../../server-code/src/common/HPM.h"
+ (*getBattleConf) (const char* w1, int *value);
+
+
+# 167 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 167 "../../../server-code/src/common/HPM.h"
+ (*DataCheck) (struct s_HPMDataCheck *src, unsigned int size, int version, char *name);
+ void (*datacheck_init) (const struct s_HPMDataCheck *src, unsigned int length, int version);
+ void (*datacheck_final) (void);
+
+ void (*data_store_create) (struct hplugin_data_store **storeptr, enum HPluginDataTypes type);
+ void (*data_store_destroy) (struct hplugin_data_store **storeptr);
+
+# 173 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 173 "../../../server-code/src/common/HPM.h"
+ (*data_store_validate) (enum HPluginDataTypes type, struct hplugin_data_store **storeptr,
+# 173 "../../../server-code/src/common/HPM.h" 3 4
+ _Bool
+# 173 "../../../server-code/src/common/HPM.h"
+ initialize);
+
+
+# 175 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 175 "../../../server-code/src/common/HPM.h"
+ (*data_store_validate_sub) (enum HPluginDataTypes type, struct hplugin_data_store **storeptr,
+# 175 "../../../server-code/src/common/HPM.h" 3 4
+ _Bool
+# 175 "../../../server-code/src/common/HPM.h"
+ initialize);
+};
+
+
+# 178 "../../../server-code/src/common/HPM.h" 3 4
+_Bool
+# 178 "../../../server-code/src/common/HPM.h"
+cmdline_arg_loadplugin (const char *name, const char *params);
+
+extern struct HPM_interface *HPM;
+
+void hpm_defaults(void);
+# 29 "../../../server-code/src/char/HPMchar.h" 2
+
+struct hplugin;
+
+
+# 32 "../../../server-code/src/char/HPMchar.h" 3 4
+_Bool
+# 32 "../../../server-code/src/char/HPMchar.h"
+ HPM_char_data_store_validate(enum HPluginDataTypes type, struct hplugin_data_store **storeptr,
+# 32 "../../../server-code/src/char/HPMchar.h" 3 4
+ _Bool
+# 32 "../../../server-code/src/char/HPMchar.h"
+ initialize);
+
+void HPM_char_plugin_load_sub(struct hplugin *plugin);
+
+void HPM_char_do_final(void);
+
+void HPM_char_do_init(void);
+# 27 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/geoip.h" 1
+# 29 "../../../server-code/src/char/geoip.h"
+struct s_geoip {
+ unsigned char *cache;
+
+# 31 "../../../server-code/src/char/geoip.h" 3 4
+_Bool
+# 31 "../../../server-code/src/char/geoip.h"
+ active;
+};
+
+
+
+
+
+struct geoip_interface {
+ struct s_geoip *data;
+ const char* (*getcountry) (uint32 ipnum);
+ void (*final) (
+# 41 "../../../server-code/src/char/geoip.h" 3 4
+ _Bool
+# 41 "../../../server-code/src/char/geoip.h"
+ shutdown);
+ void (*init) (void);
+};
+
+
+void geoip_defaults(void);
+
+
+extern struct geoip_interface *geoip;
+# 28 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_auction.h" 1
+# 28 "../../../server-code/src/char/int_auction.h"
+struct DBMap;
+
+
+
+
+struct inter_auction_interface {
+ struct DBMap *db;
+ int (*count) (int char_id,
+# 35 "../../../server-code/src/char/int_auction.h" 3 4
+ _Bool
+# 35 "../../../server-code/src/char/int_auction.h"
+ buy);
+ void (*save) (struct auction_data *auction);
+ unsigned int (*create) (struct auction_data *auction);
+ int (*end_timer) (int tid, int64 tick, int id, intptr_t data);
+ void (*delete_) (struct auction_data *auction);
+ void (*fromsql) (void);
+ int (*parse_frommap) (int fd);
+ int (*sql_init) (void);
+ void (*sql_final) (void);
+};
+
+
+void inter_auction_defaults(void);
+
+
+extern struct inter_auction_interface *inter_auction;
+# 29 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_elemental.h" 1
+# 29 "../../../server-code/src/char/int_elemental.h"
+struct inter_elemental_interface {
+ void (*sql_init) (void);
+ void (*sql_final) (void);
+ int (*parse_frommap) (int fd);
+};
+
+
+void inter_elemental_defaults(void);
+
+
+extern struct inter_elemental_interface *inter_elemental;
+# 30 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_guild.h" 1
+# 27 "../../../server-code/src/char/int_guild.h"
+enum {
+ GS_BASIC = 0x0001,
+ GS_MEMBER = 0x0002,
+ GS_POSITION = 0x0004,
+ GS_ALLIANCE = 0x0008,
+ GS_EXPULSION = 0x0010,
+ GS_SKILL = 0x0020,
+ GS_EMBLEM = 0x0040,
+ GS_CONNECT = 0x0080,
+ GS_LEVEL = 0x0100,
+ GS_MES = 0x0200,
+ GS_MASK = 0x03FF,
+ GS_BASIC_MASK = (GS_BASIC | GS_EMBLEM | GS_CONNECT | GS_LEVEL | GS_MES),
+ GS_REMOVE = 0x8000,
+};
+
+
+
+
+struct inter_guild_interface {
+ struct DBMap *guild_db;
+ struct DBMap *castle_db;
+ unsigned int exp[50];
+
+ int (*save_timer) (int tid, int64 tick, int id, intptr_t data);
+ int (*removemember_tosql) (int account_id, int char_id);
+ int (*tosql) (struct guild *g, int flag);
+ struct guild* (*fromsql) (int guild_id);
+ int (*castle_tosql) (struct guild_castle *gc);
+ struct guild_castle* (*castle_fromsql) (int castle_id);
+
+# 57 "../../../server-code/src/char/int_guild.h" 3 4
+_Bool
+# 57 "../../../server-code/src/char/int_guild.h"
+ (*exp_parse_row) (char* split[], int column, int current);
+ int (*CharOnline) (int char_id, int guild_id);
+ int (*CharOffline) (int char_id, int guild_id);
+ int (*sql_init) (void);
+ int (*db_final) (union DBKey key, struct DBData *data, va_list ap);
+ void (*sql_final) (void);
+ int (*search_guildname) (const char *str);
+
+# 64 "../../../server-code/src/char/int_guild.h" 3 4
+_Bool
+# 64 "../../../server-code/src/char/int_guild.h"
+ (*check_empty) (struct guild *g);
+ unsigned int (*nextexp) (int level);
+ int (*checkskill) (struct guild *g, int id);
+ int (*calcinfo) (struct guild *g);
+ int (*sex_changed) (int guild_id, int account_id, int char_id, short gender);
+ int (*charname_changed) (int guild_id, int account_id, int char_id, char *name);
+ int (*parse_frommap) (int fd);
+ int (*leave) (int guild_id, int account_id, int char_id);
+ int (*broken) (int guild_id);
+};
+
+
+void inter_guild_defaults(void);
+
+
+extern struct inter_guild_interface *inter_guild;
+# 31 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_homun.h" 1
+# 29 "../../../server-code/src/char/int_homun.h"
+struct inter_homunculus_interface {
+ int (*sql_init) (void);
+ void (*sql_final) (void);
+ int (*parse_frommap) (int fd);
+};
+
+
+void inter_homunculus_defaults(void);
+
+
+extern struct inter_homunculus_interface *inter_homunculus;
+# 32 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_mail.h" 1
+# 26 "../../../server-code/src/char/int_mail.h"
+struct item;
+struct mail_data;
+struct mail_message;
+
+
+
+
+struct inter_mail_interface {
+ int (*sql_init) (void);
+ void (*sql_final) (void);
+ int (*parse_frommap) (int fd);
+ int (*fromsql) (int char_id, struct mail_data* md);
+ int (*savemessage) (struct mail_message* msg);
+
+# 39 "../../../server-code/src/char/int_mail.h" 3 4
+_Bool
+# 39 "../../../server-code/src/char/int_mail.h"
+ (*loadmessage) (int mail_id, struct mail_message* msg);
+
+# 40 "../../../server-code/src/char/int_mail.h" 3 4
+_Bool
+# 40 "../../../server-code/src/char/int_mail.h"
+ (*DeleteAttach) (int mail_id);
+ void (*sendmail) (int send_id, const char* send_name, int dest_id, const char* dest_name, const char* title, const char* body, int zeny, struct item *item);
+};
+
+
+void inter_mail_defaults(void);
+
+
+extern struct inter_mail_interface *inter_mail;
+# 33 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_mercenary.h" 1
+# 26 "../../../server-code/src/char/int_mercenary.h"
+struct mmo_charstatus;
+
+
+
+
+struct inter_mercenary_interface {
+
+# 32 "../../../server-code/src/char/int_mercenary.h" 3 4
+_Bool
+# 32 "../../../server-code/src/char/int_mercenary.h"
+ (*owner_fromsql) (int char_id, struct mmo_charstatus *status);
+
+# 33 "../../../server-code/src/char/int_mercenary.h" 3 4
+_Bool
+# 33 "../../../server-code/src/char/int_mercenary.h"
+ (*owner_tosql) (int char_id, struct mmo_charstatus *status);
+
+# 34 "../../../server-code/src/char/int_mercenary.h" 3 4
+_Bool
+# 34 "../../../server-code/src/char/int_mercenary.h"
+ (*owner_delete) (int char_id);
+ int (*sql_init) (void);
+ void (*sql_final) (void);
+ int (*parse_frommap) (int fd);
+};
+
+
+void inter_mercenary_defaults(void);
+
+
+extern struct inter_mercenary_interface *inter_mercenary;
+# 34 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_party.h" 1
+# 28 "../../../server-code/src/char/int_party.h"
+struct DBMap;
+
+
+enum {
+ PS_CREATE = 0x01,
+ PS_BASIC = 0x02,
+ PS_LEADER = 0x04,
+ PS_ADDMEMBER = 0x08,
+ PS_DELMEMBER = 0x10,
+ PS_BREAK = 0x20,
+};
+
+struct party_data {
+ struct party party;
+ unsigned int min_lv, max_lv;
+ int family;
+ unsigned char size;
+};
+
+
+
+
+struct inter_party_interface {
+ struct party_data *pt;
+ struct DBMap *db;
+ int (*check_lv) (struct party_data *p);
+ void (*calc_state) (struct party_data *p);
+ int (*tosql) (struct party *p, int flag, int index);
+ struct party_data* (*fromsql) (int party_id);
+ int (*sql_init) (void);
+ void (*sql_final) (void);
+ struct party_data* (*search_partyname) (const char *str);
+ int (*check_exp_share) (struct party_data *p);
+ int (*check_empty) (struct party_data *p);
+ int (*parse_frommap) (int fd);
+ int (*leave) (int party_id,int account_id, int char_id);
+ int (*CharOnline) (int char_id, int party_id);
+ int (*CharOffline) (int char_id, int party_id);
+};
+
+
+void inter_party_defaults(void);
+
+
+extern struct inter_party_interface *inter_party;
+# 35 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_pet.h" 1
+# 26 "../../../server-code/src/char/int_pet.h"
+struct s_pet;
+
+
+
+
+struct inter_pet_interface {
+ struct s_pet *pt;
+ int (*tosql) (const struct s_pet *p);
+ int (*fromsql) (int pet_id, struct s_pet* p);
+ int (*sql_init) (void);
+ void (*sql_final) (void);
+ int (*delete_) (int pet_id);
+ int (*parse_frommap) (int fd);
+};
+
+
+void inter_pet_defaults(void);
+
+
+extern struct inter_pet_interface *inter_pet;
+# 36 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_quest.h" 1
+# 29 "../../../server-code/src/char/int_quest.h"
+struct inter_quest_interface {
+ int (*parse_frommap) (int fd);
+};
+
+
+void inter_quest_defaults(void);
+
+
+extern struct inter_quest_interface *inter_quest;
+# 37 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/int_storage.h" 1
+# 26 "../../../server-code/src/char/int_storage.h"
+struct storage_data;
+struct guild_storage;
+
+
+
+
+struct inter_storage_interface {
+ int (*tosql) (int account_id, struct storage_data* p);
+ int (*fromsql) (int account_id, struct storage_data* p);
+ int (*guild_storage_tosql) (int guild_id, const struct guild_storage *p);
+ int (*guild_storage_fromsql) (int guild_id, struct guild_storage* p);
+ int (*sql_init) (void);
+ void (*sql_final) (void);
+ int (*delete_) (int account_id);
+ int (*guild_storage_delete) (int guild_id);
+ int (*parse_frommap) (int fd);
+};
+
+
+void inter_storage_defaults(void);
+
+
+extern struct inter_storage_interface *inter_storage;
+# 38 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/inter.h" 1
+# 30 "../../../server-code/src/char/inter.h"
+struct Sql;
+
+
+
+
+struct inter_interface {
+ struct Sql *sql_handle;
+ const char* (*msg_txt) (int msg_number);
+
+# 38 "../../../server-code/src/char/inter.h" 3 4
+_Bool
+# 38 "../../../server-code/src/char/inter.h"
+ (*msg_config_read) (const char *cfg_name,
+# 38 "../../../server-code/src/char/inter.h" 3 4
+ _Bool
+# 38 "../../../server-code/src/char/inter.h"
+ allow_override);
+ void (*do_final_msg) (void);
+ const char* (*job_name) (int class_);
+ void (*vmsg_to_fd) (int fd, int u_fd, int aid, char* msg, va_list ap);
+ void (*msg_to_fd) (int fd, int u_fd, int aid, char *msg, ...) __attribute__((format(printf, 4, 5)));
+ void (*savereg) (int account_id, int char_id, const char *key, unsigned int index, intptr_t val,
+# 43 "../../../server-code/src/char/inter.h" 3 4
+ _Bool
+# 43 "../../../server-code/src/char/inter.h"
+ is_string);
+ int (*accreg_fromsql) (int account_id,int char_id, int fd, int type);
+ int (*config_read) (const char* cfgName);
+ int (*vlog) (char* fmt, va_list ap);
+ int (*log) (char* fmt, ...);
+ int (*init_sql) (const char *file);
+ int (*mapif_init) (int fd);
+ int (*check_ttl_wisdata_sub) (union DBKey key, struct DBData *data, va_list ap);
+ int (*check_ttl_wisdata) (void);
+ int (*check_length) (int fd, int length);
+ int (*parse_frommap) (int fd);
+ void (*final) (void);
+};
+
+
+extern unsigned int party_share_level;
+
+void inter_defaults(void);
+
+
+extern struct inter_interface *inter;
+# 39 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/loginif.h" 1
+# 26 "../../../server-code/src/char/loginif.h"
+struct char_session_data;
+
+
+
+
+struct loginif_interface {
+ void (*init) (void);
+ void (*final) (void);
+ void (*reset) (void);
+ void (*check_shutdown) (void);
+ void (*on_disconnect) (void);
+ void (*on_ready) (void);
+ void (*block_account) (int account_id, int flag);
+ void (*ban_account) (int account_id, short year, short month, short day, short hour, short minute, short second);
+ void (*unban_account) (int account_id);
+ void (*changesex) (int account_id);
+ void (*auth) (int fd, struct char_session_data* sd, uint32 ipl);
+ void (*send_users_count) (int users);
+ void (*connect_to_server) (void);
+};
+
+
+void loginif_defaults(void);
+
+
+extern struct loginif_interface *loginif;
+# 40 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/mapif.h" 1
+# 26 "../../../server-code/src/char/mapif.h"
+struct WisData;
+
+
+
+
+struct mapif_interface {
+ void (*ban) (int id, unsigned int flag, int status);
+ void (*server_init) (int id);
+ void (*server_destroy) (int id);
+ void (*server_reset) (int id);
+ void (*on_disconnect) (int id);
+ void (*on_parse_accinfo) (int account_id, int u_fd, int u_aid, int u_group, int map_fd);
+ void (*char_ban) (int char_id, time_t timestamp);
+ int (*sendall) (const unsigned char *buf, unsigned int len);
+ int (*sendallwos) (int sfd, unsigned char *buf, unsigned int len);
+ int (*send) (int fd, unsigned char *buf, unsigned int len);
+ void (*send_users_count) (int users);
+ void (*auction_message) (int char_id, unsigned char result);
+ void (*auction_sendlist) (int fd, int char_id, short count, short pages, unsigned char *buf);
+ void (*parse_auction_requestlist) (int fd);
+ void (*auction_register) (int fd, struct auction_data *auction);
+ void (*parse_auction_register) (int fd);
+ void (*auction_cancel) (int fd, int char_id, unsigned char result);
+ void (*parse_auction_cancel) (int fd);
+ void (*auction_close) (int fd, int char_id, unsigned char result);
+ void (*parse_auction_close) (int fd);
+ void (*auction_bid) (int fd, int char_id, int bid, unsigned char result);
+ void (*parse_auction_bid) (int fd);
+
+# 54 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 54 "../../../server-code/src/char/mapif.h"
+ (*elemental_create) (struct s_elemental *ele);
+
+# 55 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 55 "../../../server-code/src/char/mapif.h"
+ (*elemental_save) (const struct s_elemental *ele);
+
+# 56 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 56 "../../../server-code/src/char/mapif.h"
+ (*elemental_load) (int ele_id, int char_id, struct s_elemental *ele);
+
+# 57 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 57 "../../../server-code/src/char/mapif.h"
+ (*elemental_delete) (int ele_id);
+ void (*elemental_send) (int fd, struct s_elemental *ele, unsigned char flag);
+ void (*parse_elemental_create) (int fd, const struct s_elemental *ele);
+ void (*parse_elemental_load) (int fd, int ele_id, int char_id);
+ void (*elemental_deleted) (int fd, unsigned char flag);
+ void (*parse_elemental_delete) (int fd, int ele_id);
+ void (*elemental_saved) (int fd, unsigned char flag);
+ void (*parse_elemental_save) (int fd, const struct s_elemental *ele);
+ int (*guild_created) (int fd, int account_id, struct guild *g);
+ int (*guild_noinfo) (int fd, int guild_id);
+ int (*guild_info) (int fd, struct guild *g);
+ int (*guild_memberadded) (int fd, int guild_id, int account_id, int char_id, int flag);
+ int (*guild_withdraw) (int guild_id, int account_id, int char_id, int flag, const char *name, const char *mes);
+ int (*guild_memberinfoshort) (struct guild *g, int idx);
+ int (*guild_broken) (int guild_id, int flag);
+ int (*guild_message) (int guild_id, int account_id, const char *mes, int len, int sfd);
+ int (*guild_basicinfochanged) (int guild_id, int type, const void *data, int len);
+ int (*guild_memberinfochanged) (int guild_id, int account_id, int char_id, int type, const void *data, int len);
+ int (*guild_skillupack) (int guild_id, uint16 skill_id, int account_id);
+ int (*guild_alliance) (int guild_id1, int guild_id2, int account_id1, int account_id2, int flag, const char *name1, const char *name2);
+ int (*guild_position) (struct guild *g, int idx);
+ int (*guild_notice) (struct guild *g);
+ int (*guild_emblem) (struct guild *g);
+ int (*guild_master_changed) (struct guild *g, int aid, int cid);
+ int (*guild_castle_dataload) (int fd, int sz, const int *castle_ids);
+ int (*parse_CreateGuild) (int fd, int account_id, const char *name, const struct guild_member *master);
+ int (*parse_GuildInfo) (int fd, int guild_id);
+ int (*parse_GuildAddMember) (int fd, int guild_id, const struct guild_member *m);
+ int (*parse_GuildLeave) (int fd, int guild_id, int account_id, int char_id, int flag, const char *mes);
+ int (*parse_GuildChangeMemberInfoShort) (int fd, int guild_id, int account_id, int char_id, int online, int lv, int class_);
+ int (*parse_BreakGuild) (int fd, int guild_id);
+ int (*parse_GuildMessage) (int fd, int guild_id, int account_id, const char *mes, int len);
+ int (*parse_GuildBasicInfoChange) (int fd, int guild_id, int type, const void *data, int len);
+ int (*parse_GuildMemberInfoChange) (int fd, int guild_id, int account_id, int char_id, int type, const char *data, int len);
+ int (*parse_GuildPosition) (int fd, int guild_id, int idx, const struct guild_position *p);
+ int (*parse_GuildSkillUp) (int fd, int guild_id, uint16 skill_id, int account_id, int max);
+ int (*parse_GuildDeleteAlliance) (struct guild *g, int guild_id, int account_id1, int account_id2, int flag);
+ int (*parse_GuildAlliance) (int fd, int guild_id1, int guild_id2, int account_id1, int account_id2, int flag);
+ int (*parse_GuildNotice) (int fd, int guild_id, const char *mes1, const char *mes2);
+ int (*parse_GuildEmblem) (int fd, int len, int guild_id, int dummy, const char *data);
+ int (*parse_GuildCastleDataLoad) (int fd, int len, const int *castle_ids);
+ int (*parse_GuildCastleDataSave) (int fd, int castle_id, int index, int value);
+ int (*parse_GuildMasterChange) (int fd, int guild_id, const char* name, int len);
+ void (*homunculus_created) (int fd, int account_id, const struct s_homunculus *sh, unsigned char flag);
+ void (*homunculus_deleted) (int fd, int flag);
+ void (*homunculus_loaded) (int fd, int account_id, struct s_homunculus *hd);
+ void (*homunculus_saved) (int fd, int account_id,
+# 103 "../../../server-code/src/char/mapif.h" 3 4
+ _Bool
+# 103 "../../../server-code/src/char/mapif.h"
+ flag);
+ void (*homunculus_renamed) (int fd, int account_id, int char_id, unsigned char flag, const char *name);
+
+# 105 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 105 "../../../server-code/src/char/mapif.h"
+ (*homunculus_create) (struct s_homunculus *hd);
+
+# 106 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 106 "../../../server-code/src/char/mapif.h"
+ (*homunculus_save) (const struct s_homunculus *hd);
+
+# 107 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 107 "../../../server-code/src/char/mapif.h"
+ (*homunculus_load) (int homun_id, struct s_homunculus* hd);
+
+# 108 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 108 "../../../server-code/src/char/mapif.h"
+ (*homunculus_delete) (int homun_id);
+
+# 109 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 109 "../../../server-code/src/char/mapif.h"
+ (*homunculus_rename) (const char *name);
+ void (*parse_homunculus_create) (int fd, int len, int account_id, const struct s_homunculus *phd);
+ void (*parse_homunculus_delete) (int fd, int homun_id);
+ void (*parse_homunculus_load) (int fd, int account_id, int homun_id);
+ void (*parse_homunculus_save) (int fd, int len, int account_id, const struct s_homunculus *phd);
+ void (*parse_homunculus_rename) (int fd, int account_id, int char_id, const char *name);
+ void (*mail_sendinbox) (int fd, int char_id, unsigned char flag, struct mail_data *md);
+ void (*parse_mail_requestinbox) (int fd);
+ void (*parse_mail_read) (int fd);
+ void (*mail_sendattach) (int fd, int char_id, struct mail_message *msg);
+ void (*mail_getattach) (int fd, int char_id, int mail_id);
+ void (*parse_mail_getattach) (int fd);
+ void (*mail_delete) (int fd, int char_id, int mail_id,
+# 121 "../../../server-code/src/char/mapif.h" 3 4
+ _Bool
+# 121 "../../../server-code/src/char/mapif.h"
+ failed);
+ void (*parse_mail_delete) (int fd);
+ void (*mail_new) (struct mail_message *msg);
+ void (*mail_return) (int fd, int char_id, int mail_id, int new_mail);
+ void (*parse_mail_return) (int fd);
+ void (*mail_send) (int fd, struct mail_message* msg);
+ void (*parse_mail_send) (int fd);
+
+# 128 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 128 "../../../server-code/src/char/mapif.h"
+ (*mercenary_create) (struct s_mercenary *merc);
+
+# 129 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 129 "../../../server-code/src/char/mapif.h"
+ (*mercenary_save) (const struct s_mercenary *merc);
+
+# 130 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 130 "../../../server-code/src/char/mapif.h"
+ (*mercenary_load) (int merc_id, int char_id, struct s_mercenary *merc);
+
+# 131 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 131 "../../../server-code/src/char/mapif.h"
+ (*mercenary_delete) (int merc_id);
+ void (*mercenary_send) (int fd, struct s_mercenary *merc, unsigned char flag);
+ void (*parse_mercenary_create) (int fd, const struct s_mercenary *merc);
+ void (*parse_mercenary_load) (int fd, int merc_id, int char_id);
+ void (*mercenary_deleted) (int fd, unsigned char flag);
+ void (*parse_mercenary_delete) (int fd, int merc_id);
+ void (*mercenary_saved) (int fd, unsigned char flag);
+ void (*parse_mercenary_save) (int fd, const struct s_mercenary *merc);
+ int (*party_created) (int fd, int account_id, int char_id, struct party *p);
+ void (*party_noinfo) (int fd, int party_id, int char_id);
+ void (*party_info) (int fd, struct party* p, int char_id);
+ int (*party_memberadded) (int fd, int party_id, int account_id, int char_id, int flag);
+ int (*party_optionchanged) (int fd, struct party *p, int account_id, int flag);
+ int (*party_withdraw) (int party_id,int account_id, int char_id);
+ int (*party_membermoved) (struct party *p, int idx);
+ int (*party_broken) (int party_id, int flag);
+ int (*party_message) (int party_id, int account_id, const char *mes, int len, int sfd);
+ int (*parse_CreateParty) (int fd, const char *name, int item, int item2, const struct party_member *leader);
+ void (*parse_PartyInfo) (int fd, int party_id, int char_id);
+ int (*parse_PartyAddMember) (int fd, int party_id, const struct party_member *member);
+ int (*parse_PartyChangeOption) (int fd,int party_id,int account_id,int exp,int item);
+ int (*parse_PartyLeave) (int fd, int party_id, int account_id, int char_id);
+ int (*parse_PartyChangeMap) (int fd, int party_id, int account_id, int char_id, unsigned short map, int online, unsigned int lv);
+ int (*parse_BreakParty) (int fd, int party_id);
+ int (*parse_PartyMessage) (int fd, int party_id, int account_id, const char *mes, int len);
+ int (*parse_PartyLeaderChange) (int fd, int party_id, int account_id, int char_id);
+ int (*pet_created) (int fd, int account_id, struct s_pet *p);
+ int (*pet_info) (int fd, int account_id, struct s_pet *p);
+ int (*pet_noinfo) (int fd, int account_id);
+ int (*save_pet_ack) (int fd, int account_id, int flag);
+ int (*delete_pet_ack) (int fd, int flag);
+ int (*create_pet) (int fd, int account_id, int char_id, short pet_class, short pet_lv, short pet_egg_id,
+ short pet_equip, short intimate, short hungry, char rename_flag, char incubate, const char *pet_name);
+ int (*load_pet) (int fd, int account_id, int char_id, int pet_id);
+ int (*save_pet) (int fd, int account_id, const struct s_pet *data);
+ int (*delete_pet) (int fd, int pet_id);
+ int (*parse_CreatePet) (int fd);
+ int (*parse_LoadPet) (int fd);
+ int (*parse_SavePet) (int fd);
+ int (*parse_DeletePet) (int fd);
+ struct quest *(*quests_fromsql) (int char_id, int *count);
+
+# 172 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 172 "../../../server-code/src/char/mapif.h"
+ (*quest_delete) (int char_id, int quest_id);
+
+# 173 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 173 "../../../server-code/src/char/mapif.h"
+ (*quest_add) (int char_id, struct quest qd);
+
+# 174 "../../../server-code/src/char/mapif.h" 3 4
+_Bool
+# 174 "../../../server-code/src/char/mapif.h"
+ (*quest_update) (int char_id, struct quest qd);
+ void (*quest_save_ack) (int fd, int char_id,
+# 175 "../../../server-code/src/char/mapif.h" 3 4
+ _Bool
+# 175 "../../../server-code/src/char/mapif.h"
+ success);
+ int (*parse_quest_save) (int fd);
+ void (*send_quests) (int fd, int char_id, struct quest *tmp_questlog, int num_quests);
+ int (*parse_quest_load) (int fd);
+ int (*load_guild_storage) (int fd, int account_id, int guild_id, char flag);
+ int (*save_guild_storage_ack) (int fd, int account_id, int guild_id, int fail);
+ int (*parse_LoadGuildStorage) (int fd);
+ int (*parse_SaveGuildStorage) (int fd);
+ int (*itembound_ack) (int fd, int aid, int guild_id);
+ int (*parse_ItemBoundRetrieve_sub) (int fd);
+ void (*parse_ItemBoundRetrieve) (int fd);
+ void (*parse_accinfo) (int fd);
+ void (*parse_accinfo2) (
+# 187 "../../../server-code/src/char/mapif.h" 3 4
+ _Bool
+# 187 "../../../server-code/src/char/mapif.h"
+ success, int map_fd, int u_fd, int u_aid, int account_id, const char *userid, const char *user_pass,
+ const char *email, const char *last_ip, const char *lastlogin, const char *pin_code, const char *birthdate, int group_id, int logincount, int state);
+ int (*broadcast) (const unsigned char *mes, int len, unsigned int fontColor, short fontType, short fontSize, short fontAlign, short fontY, int sfd);
+ int (*wis_message) (struct WisData *wd);
+ void (*wis_response) (int fd, const unsigned char *src, int flag);
+ int (*wis_end) (struct WisData *wd, int flag);
+ int (*account_reg_reply) (int fd,int account_id,int char_id, int type);
+ int (*disconnectplayer) (int fd, int account_id, int char_id, int reason);
+ int (*parse_broadcast) (int fd);
+ int (*parse_WisRequest) (int fd);
+ int (*parse_WisReply) (int fd);
+ int (*parse_WisToGM) (int fd);
+ int (*parse_Registry) (int fd);
+ int (*parse_RegistryRequest) (int fd);
+ void (*namechange_ack) (int fd, int account_id, int char_id, int type, int flag, const char *name);
+ int (*parse_NameChangeRequest) (int fd);
+};
+
+
+void mapif_defaults(void);
+
+
+extern struct mapif_interface *mapif;
+# 41 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/char/pincode.h" 1
+# 26 "../../../server-code/src/char/pincode.h"
+struct char_session_data;
+
+enum PincodeResponseCode {
+ PINCODE_OK = 0,
+ PINCODE_ASK = 1,
+ PINCODE_NOTSET = 2,
+ PINCODE_EXPIRED = 3,
+ PINCODE_UNUSED = 7,
+ PINCODE_WRONG = 8,
+};
+
+
+
+
+struct pincode_interface {
+
+ int enabled;
+ int changetime;
+ int maxtry;
+ int charselect;
+ unsigned int multiplier;
+ unsigned int baseSeed;
+
+ void (*handle) (int fd, struct char_session_data* sd);
+ void (*decrypt) (unsigned int userSeed, char* pin);
+ void (*error) (int account_id);
+ void (*update) (int account_id, char* pin);
+ void (*sendstate) (int fd, struct char_session_data* sd, uint16 state);
+ void (*setnew) (int fd, struct char_session_data* sd);
+ void (*change) (int fd, struct char_session_data* sd);
+ int (*compare) (int fd, struct char_session_data* sd, char* pin);
+ void (*check) (int fd, struct char_session_data* sd);
+
+# 58 "../../../server-code/src/char/pincode.h" 3 4
+_Bool
+# 58 "../../../server-code/src/char/pincode.h"
+ (*config_read) (char *w1, char *w2);
+};
+
+
+void pincode_defaults(void);
+
+
+extern struct pincode_interface *pincode;
+# 42 "../../../server-code/src/char/char.c" 2
+
+
+
+
+
+
+# 1 "../../../server-code/src/common/memmgr.h" 1
+# 80 "../../../server-code/src/common/memmgr.h"
+struct malloc_interface {
+ void (*init) (void);
+ void (*final) (void);
+
+ void* (*malloc)(size_t size, const char *file, int line, const char *func);
+ void* (*calloc)(size_t num, size_t size, const char *file, int line, const char *func);
+ void* (*realloc)(void *p, size_t size, const char *file, int line, const char *func);
+ void* (*reallocz)(void *p, size_t size, const char *file, int line, const char *func);
+ char* (*astrdup)(const char *p, const char *file, int line, const char *func);
+ char *(*astrndup)(const char *p, size_t size, const char *file, int line, const char *func);
+ void (*free)(void *p, const char *file, int line, const char *func);
+
+ void (*memory_check)(void);
+
+# 93 "../../../server-code/src/common/memmgr.h" 3 4
+_Bool
+# 93 "../../../server-code/src/common/memmgr.h"
+ (*verify_ptr)(void* ptr);
+ size_t (*usage) (void);
+
+ void (*post_shutdown) (void);
+ void (*init_messages) (void);
+};
+
+
+void malloc_defaults(void);
+
+void memmgr_report(int extra);
+
+
+extern struct malloc_interface *iMalloc;
+# 49 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/common/mapindex.h" 1
+# 28 "../../../server-code/src/common/mapindex.h"
+struct DBMap;
+# 84 "../../../server-code/src/common/mapindex.h"
+struct mapindex_interface {
+ char config_file[80];
+
+ struct DBMap *db;
+
+ int num;
+
+ char *default_map;
+
+ int default_x;
+
+ int default_y;
+
+ struct {
+ char name[(11 + 1)];
+ } list[2000];
+
+ int (*init) (void);
+ void (*final) (void);
+
+ int (*addmap) (int index, const char* name);
+ void (*removemap) (int index);
+ const char* (*getmapname) (const char* string, char* output);
+
+
+ const char* (*getmapname_ext) (const char* string, char* output);
+
+ unsigned short (*name2id) (const char*);
+ const char * (*id2name) (uint16 id, const char *file, int line, const char *func);
+
+# 113 "../../../server-code/src/common/mapindex.h" 3 4
+_Bool
+# 113 "../../../server-code/src/common/mapindex.h"
+ (*check_default) (void);
+};
+
+
+void mapindex_defaults(void);
+
+
+extern struct mapindex_interface *mapindex;
+# 50 "../../../server-code/src/char/char.c" 2
+
+# 1 "../../../server-code/src/common/nullpo.h" 1
+# 40 "../../../server-code/src/common/nullpo.h"
+# 1 "/usr/include/assert.h" 1 3 4
+# 66 "/usr/include/assert.h" 3 4
+
+
+
+
+# 69 "/usr/include/assert.h" 3 4
+extern void __assert_fail (const char *__assertion, const char *__file,
+ unsigned int __line, const char *__function)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__noreturn__));
+
+
+extern void __assert_perror_fail (int __errnum, const char *__file,
+ unsigned int __line, const char *__function)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__noreturn__));
+
+
+
+
+extern void __assert (const char *__assertion, const char *__file, int __line)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__noreturn__));
+
+
+
+# 41 "../../../server-code/src/common/nullpo.h" 2
+# 155 "../../../server-code/src/common/nullpo.h"
+
+# 155 "../../../server-code/src/common/nullpo.h"
+struct nullpo_interface {
+ void (*assert_report) (const char *file, int line, const char *func, const char *targetname, const char *title);
+};
+
+
+void nullpo_defaults(void);
+
+
+extern struct nullpo_interface *nullpo;
+# 52 "../../../server-code/src/char/char.c" 2
+
+# 1 "../../../server-code/src/common/socket.h" 1
+# 54 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/common/strlib.h" 1
+# 54 "../../../server-code/src/common/strlib.h"
+typedef enum e_svopt {
+
+ SV_NOESCAPE_NOTERMINATE = 0,
+
+ SV_ESCAPE_C = 1,
+
+ SV_TERMINATE_LF = 2,
+ SV_TERMINATE_CRLF = 4,
+ SV_TERMINATE_CR = 8,
+
+ SV_KEEP_TERMINATOR = 16
+} e_svopt;
+
+
+
+
+
+
+struct s_svstate {
+ const char* str;
+ int len;
+ int off;
+ int start;
+ int end;
+ enum e_svopt opt;
+ char delim;
+
+# 80 "../../../server-code/src/common/strlib.h" 3 4
+_Bool
+# 80 "../../../server-code/src/common/strlib.h"
+ done;
+};
+
+
+
+struct StringBuf {
+ char *buf_;
+ char *ptr_;
+ unsigned int max_;
+};
+typedef struct StringBuf StringBuf;
+
+struct strlib_interface {
+ char *(*jstrescape) (char* pt);
+ char *(*jstrescapecpy) (char* pt, const char* spt);
+ int (*jmemescapecpy) (char* pt, const char* spt, int size);
+ int (*remove_control_chars_) (char* str);
+ char *(*trim_) (char* str);
+ char *(*normalize_name_) (char* str,const char* delims);
+ const char *(*stristr_) (const char *haystack, const char *needle);
+
+
+ size_t (*strnlen_) (const char* string, size_t maxlen);
+
+
+ char * (*strtok_r_) (char *s1, const char *s2, char **lasts);
+
+ int (*e_mail_check_) (char* email);
+ int (*config_switch_) (const char* str);
+
+
+ char *(*safestrncpy_) (char* dst, const char* src, size_t n);
+
+
+ size_t (*safestrnlen_) (const char* string, size_t maxlen);
+
+
+
+
+ int (*safesnprintf_) (char *buf, size_t sz, const char *fmt, ...) __attribute__((format(printf, 3, 4)));
+
+
+
+ int (*strline_) (const char* str, size_t pos);
+
+
+
+
+
+# 128 "../../../server-code/src/common/strlib.h" 3 4
+_Bool
+# 128 "../../../server-code/src/common/strlib.h"
+ (*bin2hex_) (char* output, unsigned char* input, size_t count);
+};
+
+struct stringbuf_interface {
+ StringBuf* (*Malloc) (void);
+ void (*Init) (StringBuf* self);
+ int (*Printf) (StringBuf *self, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
+ int (*Vprintf) (StringBuf* self, const char* fmt, va_list args);
+ int (*Append) (StringBuf* self, const StringBuf *sbuf);
+ int (*AppendStr) (StringBuf* self, const char* str);
+ int (*Length) (StringBuf* self);
+ char* (*Value) (StringBuf* self);
+ void (*Clear) (StringBuf* self);
+ void (*Destroy) (StringBuf* self);
+ void (*Free) (StringBuf* self);
+};
+
+struct sv_interface {
+
+
+
+
+
+ int (*parse_next) (struct s_svstate* svstate);
+
+
+
+
+
+
+ int (*parse) (const char* str, int len, int startoff, char delim, int* out_pos, int npos, enum e_svopt opt);
+
+
+
+
+
+
+
+ int (*split) (char* str, int len, int startoff, char delim, char** out_fields, int nfields, enum e_svopt opt);
+
+
+
+
+ size_t (*escape_c) (char* out_dest, const char* src, size_t len, const char* escapes);
+
+
+
+
+ size_t (*unescape_c) (char* out_dest, const char* src, size_t len);
+
+
+ const char* (*skip_escaped_c) (const char* p);
+
+
+
+
+
+# 184 "../../../server-code/src/common/strlib.h" 3 4
+_Bool
+# 184 "../../../server-code/src/common/strlib.h"
+ (*readdb) (const char* directory, const char* filename, char delim, int mincols, int maxcols, int maxrows,
+# 184 "../../../server-code/src/common/strlib.h" 3 4
+ _Bool
+# 184 "../../../server-code/src/common/strlib.h"
+ (*parseproc)(char* fields[], int columns, int current));
+};
+
+
+void strlib_defaults(void);
+
+
+extern struct strlib_interface *strlib;
+extern struct stringbuf_interface *StrBuf;
+extern struct sv_interface *sv;
+# 55 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/common/sql.h" 1
+# 40 "../../../server-code/src/common/sql.h"
+enum SqlDataType {
+ SQLDT_NULL,
+
+ SQLDT_INT8,
+ SQLDT_INT16,
+ SQLDT_INT32,
+ SQLDT_INT64,
+ SQLDT_UINT8,
+ SQLDT_UINT16,
+ SQLDT_UINT32,
+ SQLDT_UINT64,
+
+ SQLDT_CHAR,
+ SQLDT_SHORT,
+ SQLDT_INT,
+ SQLDT_LONG,
+ SQLDT_LONGLONG,
+ SQLDT_UCHAR,
+ SQLDT_USHORT,
+ SQLDT_UINT,
+ SQLDT_ULONG,
+ SQLDT_ULONGLONG,
+
+ SQLDT_FLOAT,
+ SQLDT_DOUBLE,
+
+ SQLDT_STRING,
+ SQLDT_ENUM,
+
+
+ SQLDT_BLOB,
+ SQLDT_LASTID
+};
+
+struct Sql;
+struct SqlStmt;
+
+struct sql_interface {
+
+
+
+ int (*Connect) (struct Sql *self, const char *user, const char *passwd, const char *host, uint16 port, const char *db);
+
+
+
+ int (*GetTimeout) (struct Sql *self, uint32 *out_timeout);
+
+
+
+ int (*GetColumnNames) (struct Sql *self, const char *table, char *out_buf, size_t buf_len, char sep);
+
+
+
+ int (*SetEncoding) (struct Sql *self, const char *encoding);
+
+
+
+ int (*Ping) (struct Sql *self);
+
+
+
+
+ size_t (*EscapeString) (struct Sql *self, char *out_to, const char *from);
+
+
+
+
+ size_t (*EscapeStringLen) (struct Sql *self, char *out_to, const char *from, size_t from_len);
+
+
+
+
+
+ int (*Query) (struct Sql *self, const char *query, ...) __attribute__((format(printf, 2, 3)));
+
+
+
+
+
+ int (*QueryV) (struct Sql *self, const char *query, va_list args);
+
+
+
+
+
+ int (*QueryStr) (struct Sql *self, const char *query);
+
+
+
+ uint64 (*LastInsertId) (struct Sql *self);
+
+
+
+ uint32 (*NumColumns) (struct Sql *self);
+
+
+
+ uint64 (*NumRows) (struct Sql *self);
+
+
+
+
+ int (*NextRow) (struct Sql *self);
+
+
+
+
+ int (*GetData) (struct Sql *self, size_t col, char **out_buf, size_t *out_len);
+
+ void (*FreeResult) (struct Sql *self);
+
+ void (*ShowDebug_) (struct Sql *self, const char *debug_file, const unsigned long debug_line);
+
+ void (*Free) (struct Sql *self);
+
+ struct Sql *(*Malloc) (void);
+# 179 "../../../server-code/src/common/sql.h"
+ struct SqlStmt* (*StmtMalloc)(struct Sql *sql);
+
+
+
+
+
+
+ int (*StmtPrepare) (struct SqlStmt *self, const char *query, ...) __attribute__((format(printf, 2, 3)));
+
+
+
+
+
+
+ int (*StmtPrepareV)(struct SqlStmt *self, const char *query, va_list args);
+
+
+
+
+
+
+ int (*StmtPrepareStr)(struct SqlStmt *self, const char *query);
+
+
+
+
+ size_t (*StmtNumParams)(struct SqlStmt *self);
+
+
+
+
+
+
+ int (*StmtBindParam)(struct SqlStmt *self, size_t idx, enum SqlDataType buffer_type, const void *buffer, size_t buffer_len);
+
+
+
+
+
+ int (*StmtExecute)(struct SqlStmt *self);
+
+
+
+
+ uint64 (*StmtLastInsertId)(struct SqlStmt *self);
+
+
+
+
+ size_t (*StmtNumColumns)(struct SqlStmt *self);
+
+
+
+
+
+
+
+ int (*StmtBindColumn)(struct SqlStmt *self, size_t idx, enum SqlDataType buffer_type, void *buffer, size_t buffer_len, uint32 *out_length, int8 *out_is_null);
+
+
+
+
+ uint64 (*StmtNumRows)(struct SqlStmt *self);
+
+
+
+
+
+ int (*StmtNextRow)(struct SqlStmt *self);
+
+
+ void (*StmtFreeResult)(struct SqlStmt *self);
+
+
+ void (*StmtFree)(struct SqlStmt *self);
+
+ void (*StmtShowDebug_)(struct SqlStmt *self, const char *debug_file, const unsigned long debug_line);
+
+};
+
+
+void sql_defaults(void);
+
+void Sql_Init(void);
+
+void Sql_HerculesUpdateCheck(struct Sql *self);
+void Sql_HerculesUpdateSkip(struct Sql *self, const char *filename);
+
+
+extern struct sql_interface *SQL;
+# 56 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/common/timer.h" 1
+# 32 "../../../server-code/src/common/timer.h"
+enum {
+ TIMER_ONCE_AUTODEL = 0x01,
+ TIMER_INTERVAL = 0x02,
+ TIMER_REMOVE_HEAP = 0x10,
+};
+
+
+
+typedef int (*TimerFunc)(int tid, int64 tick, int id, intptr_t data);
+
+struct TimerData {
+ int64 tick;
+ TimerFunc func;
+ unsigned char type;
+ int interval;
+
+
+ int id;
+ intptr_t data;
+};
+
+
+
+
+
+
+
+struct timer_interface {
+
+
+ int64 (*gettick) (void);
+ int64 (*gettick_nocache) (void);
+
+ int (*add) (int64 tick, TimerFunc func, int id, intptr_t data);
+ int (*add_interval) (int64 tick, TimerFunc func, int id, intptr_t data, int interval);
+ const struct TimerData *(*get) (int tid);
+ int (*delete) (int tid, TimerFunc func);
+
+ int64 (*addtick) (int tid, int64 tick);
+ int64 (*settick) (int tid, int64 tick);
+
+ int (*add_func_list) (TimerFunc func, char* name);
+
+ unsigned long (*get_uptime) (void);
+
+ int (*perform) (int64 tick);
+ void (*init) (void);
+ void (*final) (void);
+};
+
+
+void timer_defaults(void);
+
+
+extern struct timer_interface *timer;
+# 57 "../../../server-code/src/char/char.c" 2
+# 1 "../../../server-code/src/common/utils.h" 1
+# 26 "../../../server-code/src/common/utils.h"
+# 1 "/usr/include/stdio.h" 1 3 4
+# 29 "/usr/include/stdio.h" 3 4
+
+
+
+
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 34 "/usr/include/stdio.h" 2 3 4
+# 44 "/usr/include/stdio.h" 3 4
+
+# 44 "/usr/include/stdio.h" 3 4
+struct _IO_FILE;
+
+
+
+typedef struct _IO_FILE FILE;
+
+
+
+
+
+# 64 "/usr/include/stdio.h" 3 4
+typedef struct _IO_FILE __FILE;
+# 74 "/usr/include/stdio.h" 3 4
+# 1 "/usr/include/libio.h" 1 3 4
+# 31 "/usr/include/libio.h" 3 4
+# 1 "/usr/include/_G_config.h" 1 3 4
+# 15 "/usr/include/_G_config.h" 3 4
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 16 "/usr/include/_G_config.h" 2 3 4
+
+
+
+
+# 1 "/usr/include/wchar.h" 1 3 4
+# 82 "/usr/include/wchar.h" 3 4
+typedef struct
+{
+ int __count;
+ union
+ {
+
+ unsigned int __wch;
+
+
+
+ char __wchb[4];
+ } __value;
+} __mbstate_t;
+# 21 "/usr/include/_G_config.h" 2 3 4
+typedef struct
+{
+ __off_t __pos;
+ __mbstate_t __state;
+} _G_fpos_t;
+typedef struct
+{
+ __off64_t __pos;
+ __mbstate_t __state;
+} _G_fpos64_t;
+# 32 "/usr/include/libio.h" 2 3 4
+# 144 "/usr/include/libio.h" 3 4
+struct _IO_jump_t; struct _IO_FILE;
+
+
+
+
+
+typedef void _IO_lock_t;
+
+
+
+
+
+struct _IO_marker {
+ struct _IO_marker *_next;
+ struct _IO_FILE *_sbuf;
+
+
+
+ int _pos;
+# 173 "/usr/include/libio.h" 3 4
+};
+
+
+enum __codecvt_result
+{
+ __codecvt_ok,
+ __codecvt_partial,
+ __codecvt_error,
+ __codecvt_noconv
+};
+# 241 "/usr/include/libio.h" 3 4
+struct _IO_FILE {
+ int _flags;
+
+
+
+
+ char* _IO_read_ptr;
+ char* _IO_read_end;
+ char* _IO_read_base;
+ char* _IO_write_base;
+ char* _IO_write_ptr;
+ char* _IO_write_end;
+ char* _IO_buf_base;
+ char* _IO_buf_end;
+
+ char *_IO_save_base;
+ char *_IO_backup_base;
+ char *_IO_save_end;
+
+ struct _IO_marker *_markers;
+
+ struct _IO_FILE *_chain;
+
+ int _fileno;
+
+
+
+ int _flags2;
+
+ __off_t _old_offset;
+
+
+
+ unsigned short _cur_column;
+ signed char _vtable_offset;
+ char _shortbuf[1];
+
+
+
+ _IO_lock_t *_lock;
+# 289 "/usr/include/libio.h" 3 4
+ __off64_t _offset;
+# 298 "/usr/include/libio.h" 3 4
+ void *__pad1;
+ void *__pad2;
+ void *__pad3;
+ void *__pad4;
+ size_t __pad5;
+
+ int _mode;
+
+ char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
+
+};
+
+
+typedef struct _IO_FILE _IO_FILE;
+
+
+struct _IO_FILE_plus;
+
+extern struct _IO_FILE_plus _IO_2_1_stdin_;
+extern struct _IO_FILE_plus _IO_2_1_stdout_;
+extern struct _IO_FILE_plus _IO_2_1_stderr_;
+# 334 "/usr/include/libio.h" 3 4
+typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
+
+
+
+
+
+
+
+typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf,
+ size_t __n);
+
+
+
+
+
+
+
+typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);
+
+
+typedef int __io_close_fn (void *__cookie);
+# 386 "/usr/include/libio.h" 3 4
+extern int __underflow (_IO_FILE *);
+extern int __uflow (_IO_FILE *);
+extern int __overflow (_IO_FILE *, int);
+# 430 "/usr/include/libio.h" 3 4
+extern int _IO_getc (_IO_FILE *__fp);
+extern int _IO_putc (int __c, _IO_FILE *__fp);
+extern int _IO_feof (_IO_FILE *__fp) __attribute__ ((__nothrow__ , __leaf__));
+extern int _IO_ferror (_IO_FILE *__fp) __attribute__ ((__nothrow__ , __leaf__));
+
+extern int _IO_peekc_locked (_IO_FILE *__fp);
+
+
+
+
+
+extern void _IO_flockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));
+extern void _IO_funlockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));
+extern int _IO_ftrylockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));
+# 460 "/usr/include/libio.h" 3 4
+extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,
+ __gnuc_va_list, int *__restrict);
+extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,
+ __gnuc_va_list);
+extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t);
+extern size_t _IO_sgetn (_IO_FILE *, void *, size_t);
+
+extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int);
+extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int);
+
+extern void _IO_free_backup_area (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));
+# 75 "/usr/include/stdio.h" 2 3 4
+# 90 "/usr/include/stdio.h" 3 4
+typedef __off_t off_t;
+# 102 "/usr/include/stdio.h" 3 4
+typedef __ssize_t ssize_t;
+
+
+
+
+
+
+
+typedef _G_fpos_t fpos_t;
+
+
+
+
+# 164 "/usr/include/stdio.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/stdio_lim.h" 1 3 4
+# 165 "/usr/include/stdio.h" 2 3 4
+
+
+
+extern struct _IO_FILE *stdin;
+extern struct _IO_FILE *stdout;
+extern struct _IO_FILE *stderr;
+
+
+
+
+
+
+
+extern int remove (const char *__filename) __attribute__ ((__nothrow__ , __leaf__));
+
+extern int rename (const char *__old, const char *__new) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern int renameat (int __oldfd, const char *__old, int __newfd,
+ const char *__new) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+
+
+extern FILE *tmpfile (void) ;
+# 209 "/usr/include/stdio.h" 3 4
+extern char *tmpnam (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+
+extern char *tmpnam_r (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 227 "/usr/include/stdio.h" 3 4
+extern char *tempnam (const char *__dir, const char *__pfx)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ;
+
+
+
+
+
+
+
+
+extern int fclose (FILE *__stream);
+
+
+
+
+extern int fflush (FILE *__stream);
+
+# 252 "/usr/include/stdio.h" 3 4
+extern int fflush_unlocked (FILE *__stream);
+# 266 "/usr/include/stdio.h" 3 4
+
+
+
+
+
+
+extern FILE *fopen (const char *__restrict __filename,
+ const char *__restrict __modes) ;
+
+
+
+
+extern FILE *freopen (const char *__restrict __filename,
+ const char *__restrict __modes,
+ FILE *__restrict __stream) ;
+# 295 "/usr/include/stdio.h" 3 4
+
+# 306 "/usr/include/stdio.h" 3 4
+extern FILE *fdopen (int __fd, const char *__modes) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 319 "/usr/include/stdio.h" 3 4
+extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)
+ __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+
+
+extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
+ int __modes, size_t __n) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
+ size_t __size) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern void setlinebuf (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+
+
+extern int fprintf (FILE *__restrict __stream,
+ const char *__restrict __format, ...);
+
+
+
+
+extern int printf (const char *__restrict __format, ...);
+
+extern int sprintf (char *__restrict __s,
+ const char *__restrict __format, ...) __attribute__ ((__nothrow__));
+
+
+
+
+
+extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
+ __gnuc_va_list __arg);
+
+
+
+
+extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg);
+
+extern int vsprintf (char *__restrict __s, const char *__restrict __format,
+ __gnuc_va_list __arg) __attribute__ ((__nothrow__));
+
+
+
+
+
+extern int snprintf (char *__restrict __s, size_t __maxlen,
+ const char *__restrict __format, ...)
+ __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 4)));
+
+extern int vsnprintf (char *__restrict __s, size_t __maxlen,
+ const char *__restrict __format, __gnuc_va_list __arg)
+ __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 0)));
+
+# 412 "/usr/include/stdio.h" 3 4
+extern int vdprintf (int __fd, const char *__restrict __fmt,
+ __gnuc_va_list __arg)
+ __attribute__ ((__format__ (__printf__, 2, 0)));
+extern int dprintf (int __fd, const char *__restrict __fmt, ...)
+ __attribute__ ((__format__ (__printf__, 2, 3)));
+
+
+
+
+
+
+
+
+extern int fscanf (FILE *__restrict __stream,
+ const char *__restrict __format, ...) ;
+
+
+
+
+extern int scanf (const char *__restrict __format, ...) ;
+
+extern int sscanf (const char *__restrict __s,
+ const char *__restrict __format, ...) __attribute__ ((__nothrow__ , __leaf__));
+# 443 "/usr/include/stdio.h" 3 4
+extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) __asm__ ("" "__isoc99_fscanf")
+
+ ;
+extern int scanf (const char *__restrict __format, ...) __asm__ ("" "__isoc99_scanf")
+ ;
+extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) __asm__ ("" "__isoc99_sscanf") __attribute__ ((__nothrow__ , __leaf__))
+
+ ;
+# 463 "/usr/include/stdio.h" 3 4
+
+
+
+
+
+
+
+
+extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,
+ __gnuc_va_list __arg)
+ __attribute__ ((__format__ (__scanf__, 2, 0))) ;
+
+
+
+
+
+extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg)
+ __attribute__ ((__format__ (__scanf__, 1, 0))) ;
+
+
+extern int vsscanf (const char *__restrict __s,
+ const char *__restrict __format, __gnuc_va_list __arg)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__format__ (__scanf__, 2, 0)));
+# 494 "/usr/include/stdio.h" 3 4
+extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vfscanf")
+
+
+
+ __attribute__ ((__format__ (__scanf__, 2, 0))) ;
+extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vscanf")
+
+ __attribute__ ((__format__ (__scanf__, 1, 0))) ;
+extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vsscanf") __attribute__ ((__nothrow__ , __leaf__))
+
+
+
+ __attribute__ ((__format__ (__scanf__, 2, 0)));
+# 522 "/usr/include/stdio.h" 3 4
+
+
+
+
+
+
+
+
+
+extern int fgetc (FILE *__stream);
+extern int getc (FILE *__stream);
+
+
+
+
+
+extern int getchar (void);
+
+# 550 "/usr/include/stdio.h" 3 4
+extern int getc_unlocked (FILE *__stream);
+extern int getchar_unlocked (void);
+# 561 "/usr/include/stdio.h" 3 4
+extern int fgetc_unlocked (FILE *__stream);
+
+
+
+
+
+
+
+
+
+
+
+extern int fputc (int __c, FILE *__stream);
+extern int putc (int __c, FILE *__stream);
+
+
+
+
+
+extern int putchar (int __c);
+
+# 594 "/usr/include/stdio.h" 3 4
+extern int fputc_unlocked (int __c, FILE *__stream);
+
+
+
+
+
+
+
+extern int putc_unlocked (int __c, FILE *__stream);
+extern int putchar_unlocked (int __c);
+
+
+
+
+
+
+extern int getw (FILE *__stream);
+
+
+extern int putw (int __w, FILE *__stream);
+
+
+
+
+
+
+
+
+extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
+ ;
+# 640 "/usr/include/stdio.h" 3 4
+
+# 665 "/usr/include/stdio.h" 3 4
+extern __ssize_t __getdelim (char **__restrict __lineptr,
+ size_t *__restrict __n, int __delimiter,
+ FILE *__restrict __stream) ;
+extern __ssize_t getdelim (char **__restrict __lineptr,
+ size_t *__restrict __n, int __delimiter,
+ FILE *__restrict __stream) ;
+
+
+
+
+
+
+
+extern __ssize_t getline (char **__restrict __lineptr,
+ size_t *__restrict __n,
+ FILE *__restrict __stream) ;
+
+
+
+
+
+
+
+
+extern int fputs (const char *__restrict __s, FILE *__restrict __stream);
+
+
+
+
+
+extern int puts (const char *__s);
+
+
+
+
+
+
+extern int ungetc (int __c, FILE *__stream);
+
+
+
+
+
+
+extern size_t fread (void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __stream) ;
+
+
+
+
+extern size_t fwrite (const void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __s);
+
+# 737 "/usr/include/stdio.h" 3 4
+extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __stream) ;
+extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __stream);
+
+
+
+
+
+
+
+
+extern int fseek (FILE *__stream, long int __off, int __whence);
+
+
+
+
+extern long int ftell (FILE *__stream) ;
+
+
+
+
+extern void rewind (FILE *__stream);
+
+# 773 "/usr/include/stdio.h" 3 4
+extern int fseeko (FILE *__stream, __off_t __off, int __whence);
+
+
+
+
+extern __off_t ftello (FILE *__stream) ;
+# 792 "/usr/include/stdio.h" 3 4
+
+
+
+
+
+
+extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
+
+
+
+
+extern int fsetpos (FILE *__stream, const fpos_t *__pos);
+# 815 "/usr/include/stdio.h" 3 4
+
+# 824 "/usr/include/stdio.h" 3 4
+
+
+extern void clearerr (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
+
+extern int feof (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+extern int ferror (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern void clearerr_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
+extern int feof_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
+extern int ferror_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+
+
+
+
+extern void perror (const char *__s);
+
+
+
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/sys_errlist.h" 1 3 4
+# 26 "/usr/include/x86_64-linux-gnu/bits/sys_errlist.h" 3 4
+extern int sys_nerr;
+extern const char *const sys_errlist[];
+# 854 "/usr/include/stdio.h" 2 3 4
+
+
+
+
+extern int fileno (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 872 "/usr/include/stdio.h" 3 4
+extern FILE *popen (const char *__command, const char *__modes) ;
+
+
+
+
+
+extern int pclose (FILE *__stream);
+
+
+
+
+
+extern char *ctermid (char *__s) __attribute__ ((__nothrow__ , __leaf__));
+# 912 "/usr/include/stdio.h" 3 4
+extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
+# 942 "/usr/include/stdio.h" 3 4
+
+# 27 "../../../server-code/src/common/utils.h" 2
+
+# 1 "/usr/include/unistd.h" 1 3 4
+# 27 "/usr/include/unistd.h" 3 4
+
+# 205 "/usr/include/unistd.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/posix_opt.h" 1 3 4
+# 206 "/usr/include/unistd.h" 2 3 4
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/environments.h" 1 3 4
+# 22 "/usr/include/x86_64-linux-gnu/bits/environments.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
+# 23 "/usr/include/x86_64-linux-gnu/bits/environments.h" 2 3 4
+# 210 "/usr/include/unistd.h" 2 3 4
+# 229 "/usr/include/unistd.h" 3 4
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 230 "/usr/include/unistd.h" 2 3 4
+
+
+
+
+
+typedef __gid_t gid_t;
+
+
+
+
+typedef __uid_t uid_t;
+# 258 "/usr/include/unistd.h" 3 4
+typedef __useconds_t useconds_t;
+# 277 "/usr/include/unistd.h" 3 4
+typedef __socklen_t socklen_t;
+# 290 "/usr/include/unistd.h" 3 4
+extern int access (const char *__name, int __type) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+# 307 "/usr/include/unistd.h" 3 4
+extern int faccessat (int __fd, const char *__file, int __type, int __flag)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2))) ;
+# 337 "/usr/include/unistd.h" 3 4
+extern __off_t lseek (int __fd, __off_t __offset, int __whence) __attribute__ ((__nothrow__ , __leaf__));
+# 356 "/usr/include/unistd.h" 3 4
+extern int close (int __fd);
+
+
+
+
+
+
+extern ssize_t read (int __fd, void *__buf, size_t __nbytes) ;
+
+
+
+
+
+extern ssize_t write (int __fd, const void *__buf, size_t __n) ;
+# 379 "/usr/include/unistd.h" 3 4
+extern ssize_t pread (int __fd, void *__buf, size_t __nbytes,
+ __off_t __offset) ;
+
+
+
+
+
+
+extern ssize_t pwrite (int __fd, const void *__buf, size_t __n,
+ __off_t __offset) ;
+# 420 "/usr/include/unistd.h" 3 4
+extern int pipe (int __pipedes[2]) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 435 "/usr/include/unistd.h" 3 4
+extern unsigned int alarm (unsigned int __seconds) __attribute__ ((__nothrow__ , __leaf__));
+# 447 "/usr/include/unistd.h" 3 4
+extern unsigned int sleep (unsigned int __seconds);
+
+
+
+
+
+
+
+extern __useconds_t ualarm (__useconds_t __value, __useconds_t __interval)
+ __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+extern int usleep (__useconds_t __useconds);
+# 472 "/usr/include/unistd.h" 3 4
+extern int pause (void);
+
+
+
+extern int chown (const char *__file, __uid_t __owner, __gid_t __group)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+extern int fchown (int __fd, __uid_t __owner, __gid_t __group) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern int lchown (const char *__file, __uid_t __owner, __gid_t __group)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+
+
+
+extern int fchownat (int __fd, const char *__file, __uid_t __owner,
+ __gid_t __group, int __flag)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2))) ;
+
+
+
+extern int chdir (const char *__path) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+extern int fchdir (int __fd) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 514 "/usr/include/unistd.h" 3 4
+extern char *getcwd (char *__buf, size_t __size) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 528 "/usr/include/unistd.h" 3 4
+extern char *getwd (char *__buf)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) __attribute__ ((__deprecated__)) ;
+
+
+
+
+extern int dup (int __fd) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+extern int dup2 (int __fd, int __fd2) __attribute__ ((__nothrow__ , __leaf__));
+# 546 "/usr/include/unistd.h" 3 4
+extern char **__environ;
+
+
+
+
+
+
+
+extern int execve (const char *__path, char *const __argv[],
+ char *const __envp[]) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+extern int fexecve (int __fd, char *const __argv[], char *const __envp[])
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+
+
+
+
+extern int execv (const char *__path, char *const __argv[])
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+extern int execle (const char *__path, const char *__arg, ...)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+extern int execl (const char *__path, const char *__arg, ...)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+extern int execvp (const char *__file, char *const __argv[])
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+extern int execlp (const char *__file, const char *__arg, ...)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+# 601 "/usr/include/unistd.h" 3 4
+extern int nice (int __inc) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern void _exit (int __status) __attribute__ ((__noreturn__));
+
+
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/confname.h" 1 3 4
+# 24 "/usr/include/x86_64-linux-gnu/bits/confname.h" 3 4
+enum
+ {
+ _PC_LINK_MAX,
+
+ _PC_MAX_CANON,
+
+ _PC_MAX_INPUT,
+
+ _PC_NAME_MAX,
+
+ _PC_PATH_MAX,
+
+ _PC_PIPE_BUF,
+
+ _PC_CHOWN_RESTRICTED,
+
+ _PC_NO_TRUNC,
+
+ _PC_VDISABLE,
+
+ _PC_SYNC_IO,
+
+ _PC_ASYNC_IO,
+
+ _PC_PRIO_IO,
+
+ _PC_SOCK_MAXBUF,
+
+ _PC_FILESIZEBITS,
+
+ _PC_REC_INCR_XFER_SIZE,
+
+ _PC_REC_MAX_XFER_SIZE,
+
+ _PC_REC_MIN_XFER_SIZE,
+
+ _PC_REC_XFER_ALIGN,
+
+ _PC_ALLOC_SIZE_MIN,
+
+ _PC_SYMLINK_MAX,
+
+ _PC_2_SYMLINKS
+
+ };
+
+
+enum
+ {
+ _SC_ARG_MAX,
+
+ _SC_CHILD_MAX,
+
+ _SC_CLK_TCK,
+
+ _SC_NGROUPS_MAX,
+
+ _SC_OPEN_MAX,
+
+ _SC_STREAM_MAX,
+
+ _SC_TZNAME_MAX,
+
+ _SC_JOB_CONTROL,
+
+ _SC_SAVED_IDS,
+
+ _SC_REALTIME_SIGNALS,
+
+ _SC_PRIORITY_SCHEDULING,
+
+ _SC_TIMERS,
+
+ _SC_ASYNCHRONOUS_IO,
+
+ _SC_PRIORITIZED_IO,
+
+ _SC_SYNCHRONIZED_IO,
+
+ _SC_FSYNC,
+
+ _SC_MAPPED_FILES,
+
+ _SC_MEMLOCK,
+
+ _SC_MEMLOCK_RANGE,
+
+ _SC_MEMORY_PROTECTION,
+
+ _SC_MESSAGE_PASSING,
+
+ _SC_SEMAPHORES,
+
+ _SC_SHARED_MEMORY_OBJECTS,
+
+ _SC_AIO_LISTIO_MAX,
+
+ _SC_AIO_MAX,
+
+ _SC_AIO_PRIO_DELTA_MAX,
+
+ _SC_DELAYTIMER_MAX,
+
+ _SC_MQ_OPEN_MAX,
+
+ _SC_MQ_PRIO_MAX,
+
+ _SC_VERSION,
+
+ _SC_PAGESIZE,
+
+
+ _SC_RTSIG_MAX,
+
+ _SC_SEM_NSEMS_MAX,
+
+ _SC_SEM_VALUE_MAX,
+
+ _SC_SIGQUEUE_MAX,
+
+ _SC_TIMER_MAX,
+
+
+
+
+ _SC_BC_BASE_MAX,
+
+ _SC_BC_DIM_MAX,
+
+ _SC_BC_SCALE_MAX,
+
+ _SC_BC_STRING_MAX,
+
+ _SC_COLL_WEIGHTS_MAX,
+
+ _SC_EQUIV_CLASS_MAX,
+
+ _SC_EXPR_NEST_MAX,
+
+ _SC_LINE_MAX,
+
+ _SC_RE_DUP_MAX,
+
+ _SC_CHARCLASS_NAME_MAX,
+
+
+ _SC_2_VERSION,
+
+ _SC_2_C_BIND,
+
+ _SC_2_C_DEV,
+
+ _SC_2_FORT_DEV,
+
+ _SC_2_FORT_RUN,
+
+ _SC_2_SW_DEV,
+
+ _SC_2_LOCALEDEF,
+
+
+ _SC_PII,
+
+ _SC_PII_XTI,
+
+ _SC_PII_SOCKET,
+
+ _SC_PII_INTERNET,
+
+ _SC_PII_OSI,
+
+ _SC_POLL,
+
+ _SC_SELECT,
+
+ _SC_UIO_MAXIOV,
+
+ _SC_IOV_MAX = _SC_UIO_MAXIOV,
+
+ _SC_PII_INTERNET_STREAM,
+
+ _SC_PII_INTERNET_DGRAM,
+
+ _SC_PII_OSI_COTS,
+
+ _SC_PII_OSI_CLTS,
+
+ _SC_PII_OSI_M,
+
+ _SC_T_IOV_MAX,
+
+
+
+ _SC_THREADS,
+
+ _SC_THREAD_SAFE_FUNCTIONS,
+
+ _SC_GETGR_R_SIZE_MAX,
+
+ _SC_GETPW_R_SIZE_MAX,
+
+ _SC_LOGIN_NAME_MAX,
+
+ _SC_TTY_NAME_MAX,
+
+ _SC_THREAD_DESTRUCTOR_ITERATIONS,
+
+ _SC_THREAD_KEYS_MAX,
+
+ _SC_THREAD_STACK_MIN,
+
+ _SC_THREAD_THREADS_MAX,
+
+ _SC_THREAD_ATTR_STACKADDR,
+
+ _SC_THREAD_ATTR_STACKSIZE,
+
+ _SC_THREAD_PRIORITY_SCHEDULING,
+
+ _SC_THREAD_PRIO_INHERIT,
+
+ _SC_THREAD_PRIO_PROTECT,
+
+ _SC_THREAD_PROCESS_SHARED,
+
+
+ _SC_NPROCESSORS_CONF,
+
+ _SC_NPROCESSORS_ONLN,
+
+ _SC_PHYS_PAGES,
+
+ _SC_AVPHYS_PAGES,
+
+ _SC_ATEXIT_MAX,
+
+ _SC_PASS_MAX,
+
+
+ _SC_XOPEN_VERSION,
+
+ _SC_XOPEN_XCU_VERSION,
+
+ _SC_XOPEN_UNIX,
+
+ _SC_XOPEN_CRYPT,
+
+ _SC_XOPEN_ENH_I18N,
+
+ _SC_XOPEN_SHM,
+
+
+ _SC_2_CHAR_TERM,
+
+ _SC_2_C_VERSION,
+
+ _SC_2_UPE,
+
+
+ _SC_XOPEN_XPG2,
+
+ _SC_XOPEN_XPG3,
+
+ _SC_XOPEN_XPG4,
+
+
+ _SC_CHAR_BIT,
+
+ _SC_CHAR_MAX,
+
+ _SC_CHAR_MIN,
+
+ _SC_INT_MAX,
+
+ _SC_INT_MIN,
+
+ _SC_LONG_BIT,
+
+ _SC_WORD_BIT,
+
+ _SC_MB_LEN_MAX,
+
+ _SC_NZERO,
+
+ _SC_SSIZE_MAX,
+
+ _SC_SCHAR_MAX,
+
+ _SC_SCHAR_MIN,
+
+ _SC_SHRT_MAX,
+
+ _SC_SHRT_MIN,
+
+ _SC_UCHAR_MAX,
+
+ _SC_UINT_MAX,
+
+ _SC_ULONG_MAX,
+
+ _SC_USHRT_MAX,
+
+
+ _SC_NL_ARGMAX,
+
+ _SC_NL_LANGMAX,
+
+ _SC_NL_MSGMAX,
+
+ _SC_NL_NMAX,
+
+ _SC_NL_SETMAX,
+
+ _SC_NL_TEXTMAX,
+
+
+ _SC_XBS5_ILP32_OFF32,
+
+ _SC_XBS5_ILP32_OFFBIG,
+
+ _SC_XBS5_LP64_OFF64,
+
+ _SC_XBS5_LPBIG_OFFBIG,
+
+
+ _SC_XOPEN_LEGACY,
+
+ _SC_XOPEN_REALTIME,
+
+ _SC_XOPEN_REALTIME_THREADS,
+
+
+ _SC_ADVISORY_INFO,
+
+ _SC_BARRIERS,
+
+ _SC_BASE,
+
+ _SC_C_LANG_SUPPORT,
+
+ _SC_C_LANG_SUPPORT_R,
+
+ _SC_CLOCK_SELECTION,
+
+ _SC_CPUTIME,
+
+ _SC_THREAD_CPUTIME,
+
+ _SC_DEVICE_IO,
+
+ _SC_DEVICE_SPECIFIC,
+
+ _SC_DEVICE_SPECIFIC_R,
+
+ _SC_FD_MGMT,
+
+ _SC_FIFO,
+
+ _SC_PIPE,
+
+ _SC_FILE_ATTRIBUTES,
+
+ _SC_FILE_LOCKING,
+
+ _SC_FILE_SYSTEM,
+
+ _SC_MONOTONIC_CLOCK,
+
+ _SC_MULTI_PROCESS,
+
+ _SC_SINGLE_PROCESS,
+
+ _SC_NETWORKING,
+
+ _SC_READER_WRITER_LOCKS,
+
+ _SC_SPIN_LOCKS,
+
+ _SC_REGEXP,
+
+ _SC_REGEX_VERSION,
+
+ _SC_SHELL,
+
+ _SC_SIGNALS,
+
+ _SC_SPAWN,
+
+ _SC_SPORADIC_SERVER,
+
+ _SC_THREAD_SPORADIC_SERVER,
+
+ _SC_SYSTEM_DATABASE,
+
+ _SC_SYSTEM_DATABASE_R,
+
+ _SC_TIMEOUTS,
+
+ _SC_TYPED_MEMORY_OBJECTS,
+
+ _SC_USER_GROUPS,
+
+ _SC_USER_GROUPS_R,
+
+ _SC_2_PBS,
+
+ _SC_2_PBS_ACCOUNTING,
+
+ _SC_2_PBS_LOCATE,
+
+ _SC_2_PBS_MESSAGE,
+
+ _SC_2_PBS_TRACK,
+
+ _SC_SYMLOOP_MAX,
+
+ _SC_STREAMS,
+
+ _SC_2_PBS_CHECKPOINT,
+
+
+ _SC_V6_ILP32_OFF32,
+
+ _SC_V6_ILP32_OFFBIG,
+
+ _SC_V6_LP64_OFF64,
+
+ _SC_V6_LPBIG_OFFBIG,
+
+
+ _SC_HOST_NAME_MAX,
+
+ _SC_TRACE,
+
+ _SC_TRACE_EVENT_FILTER,
+
+ _SC_TRACE_INHERIT,
+
+ _SC_TRACE_LOG,
+
+
+ _SC_LEVEL1_ICACHE_SIZE,
+
+ _SC_LEVEL1_ICACHE_ASSOC,
+
+ _SC_LEVEL1_ICACHE_LINESIZE,
+
+ _SC_LEVEL1_DCACHE_SIZE,
+
+ _SC_LEVEL1_DCACHE_ASSOC,
+
+ _SC_LEVEL1_DCACHE_LINESIZE,
+
+ _SC_LEVEL2_CACHE_SIZE,
+
+ _SC_LEVEL2_CACHE_ASSOC,
+
+ _SC_LEVEL2_CACHE_LINESIZE,
+
+ _SC_LEVEL3_CACHE_SIZE,
+
+ _SC_LEVEL3_CACHE_ASSOC,
+
+ _SC_LEVEL3_CACHE_LINESIZE,
+
+ _SC_LEVEL4_CACHE_SIZE,
+
+ _SC_LEVEL4_CACHE_ASSOC,
+
+ _SC_LEVEL4_CACHE_LINESIZE,
+
+
+
+ _SC_IPV6 = _SC_LEVEL1_ICACHE_SIZE + 50,
+
+ _SC_RAW_SOCKETS,
+
+
+ _SC_V7_ILP32_OFF32,
+
+ _SC_V7_ILP32_OFFBIG,
+
+ _SC_V7_LP64_OFF64,
+
+ _SC_V7_LPBIG_OFFBIG,
+
+
+ _SC_SS_REPL_MAX,
+
+
+ _SC_TRACE_EVENT_NAME_MAX,
+
+ _SC_TRACE_NAME_MAX,
+
+ _SC_TRACE_SYS_MAX,
+
+ _SC_TRACE_USER_EVENT_MAX,
+
+
+ _SC_XOPEN_STREAMS,
+
+
+ _SC_THREAD_ROBUST_PRIO_INHERIT,
+
+ _SC_THREAD_ROBUST_PRIO_PROTECT
+
+ };
+
+
+enum
+ {
+ _CS_PATH,
+
+
+ _CS_V6_WIDTH_RESTRICTED_ENVS,
+
+
+
+ _CS_GNU_LIBC_VERSION,
+
+ _CS_GNU_LIBPTHREAD_VERSION,
+
+
+ _CS_V5_WIDTH_RESTRICTED_ENVS,
+
+
+
+ _CS_V7_WIDTH_RESTRICTED_ENVS,
+
+
+
+ _CS_LFS_CFLAGS = 1000,
+
+ _CS_LFS_LDFLAGS,
+
+ _CS_LFS_LIBS,
+
+ _CS_LFS_LINTFLAGS,
+
+ _CS_LFS64_CFLAGS,
+
+ _CS_LFS64_LDFLAGS,
+
+ _CS_LFS64_LIBS,
+
+ _CS_LFS64_LINTFLAGS,
+
+
+ _CS_XBS5_ILP32_OFF32_CFLAGS = 1100,
+
+ _CS_XBS5_ILP32_OFF32_LDFLAGS,
+
+ _CS_XBS5_ILP32_OFF32_LIBS,
+
+ _CS_XBS5_ILP32_OFF32_LINTFLAGS,
+
+ _CS_XBS5_ILP32_OFFBIG_CFLAGS,
+
+ _CS_XBS5_ILP32_OFFBIG_LDFLAGS,
+
+ _CS_XBS5_ILP32_OFFBIG_LIBS,
+
+ _CS_XBS5_ILP32_OFFBIG_LINTFLAGS,
+
+ _CS_XBS5_LP64_OFF64_CFLAGS,
+
+ _CS_XBS5_LP64_OFF64_LDFLAGS,
+
+ _CS_XBS5_LP64_OFF64_LIBS,
+
+ _CS_XBS5_LP64_OFF64_LINTFLAGS,
+
+ _CS_XBS5_LPBIG_OFFBIG_CFLAGS,
+
+ _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,
+
+ _CS_XBS5_LPBIG_OFFBIG_LIBS,
+
+ _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS,
+
+
+ _CS_POSIX_V6_ILP32_OFF32_CFLAGS,
+
+ _CS_POSIX_V6_ILP32_OFF32_LDFLAGS,
+
+ _CS_POSIX_V6_ILP32_OFF32_LIBS,
+
+ _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS,
+
+ _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS,
+
+ _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS,
+
+ _CS_POSIX_V6_ILP32_OFFBIG_LIBS,
+
+ _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS,
+
+ _CS_POSIX_V6_LP64_OFF64_CFLAGS,
+
+ _CS_POSIX_V6_LP64_OFF64_LDFLAGS,
+
+ _CS_POSIX_V6_LP64_OFF64_LIBS,
+
+ _CS_POSIX_V6_LP64_OFF64_LINTFLAGS,
+
+ _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS,
+
+ _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS,
+
+ _CS_POSIX_V6_LPBIG_OFFBIG_LIBS,
+
+ _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS,
+
+
+ _CS_POSIX_V7_ILP32_OFF32_CFLAGS,
+
+ _CS_POSIX_V7_ILP32_OFF32_LDFLAGS,
+
+ _CS_POSIX_V7_ILP32_OFF32_LIBS,
+
+ _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS,
+
+ _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS,
+
+ _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS,
+
+ _CS_POSIX_V7_ILP32_OFFBIG_LIBS,
+
+ _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS,
+
+ _CS_POSIX_V7_LP64_OFF64_CFLAGS,
+
+ _CS_POSIX_V7_LP64_OFF64_LDFLAGS,
+
+ _CS_POSIX_V7_LP64_OFF64_LIBS,
+
+ _CS_POSIX_V7_LP64_OFF64_LINTFLAGS,
+
+ _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS,
+
+ _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS,
+
+ _CS_POSIX_V7_LPBIG_OFFBIG_LIBS,
+
+ _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS,
+
+
+ _CS_V6_ENV,
+
+ _CS_V7_ENV
+
+ };
+# 613 "/usr/include/unistd.h" 2 3 4
+
+
+extern long int pathconf (const char *__path, int __name)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern long int fpathconf (int __fd, int __name) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern long int sysconf (int __name) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern size_t confstr (int __name, char *__buf, size_t __len) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern __pid_t getpid (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern __pid_t getppid (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern __pid_t getpgrp (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern __pid_t __getpgid (__pid_t __pid) __attribute__ ((__nothrow__ , __leaf__));
+
+extern __pid_t getpgid (__pid_t __pid) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+extern int setpgid (__pid_t __pid, __pid_t __pgid) __attribute__ ((__nothrow__ , __leaf__));
+# 663 "/usr/include/unistd.h" 3 4
+extern int setpgrp (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+extern __pid_t setsid (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern __pid_t getsid (__pid_t __pid) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern __uid_t getuid (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern __uid_t geteuid (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern __gid_t getgid (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern __gid_t getegid (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern int getgroups (int __size, __gid_t __list[]) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 703 "/usr/include/unistd.h" 3 4
+extern int setuid (__uid_t __uid) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern int setreuid (__uid_t __ruid, __uid_t __euid) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern int seteuid (__uid_t __uid) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+
+
+extern int setgid (__gid_t __gid) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern int setregid (__gid_t __rgid, __gid_t __egid) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern int setegid (__gid_t __gid) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 759 "/usr/include/unistd.h" 3 4
+extern __pid_t fork (void) __attribute__ ((__nothrow__));
+
+
+
+
+
+
+
+extern __pid_t vfork (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern char *ttyname (int __fd) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern int ttyname_r (int __fd, char *__buf, size_t __buflen)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2))) ;
+
+
+
+extern int isatty (int __fd) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern int ttyslot (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern int link (const char *__from, const char *__to)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2))) ;
+
+
+
+
+extern int linkat (int __fromfd, const char *__from, int __tofd,
+ const char *__to, int __flags)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 4))) ;
+
+
+
+
+extern int symlink (const char *__from, const char *__to)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2))) ;
+
+
+
+
+extern ssize_t readlink (const char *__restrict __path,
+ char *__restrict __buf, size_t __len)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2))) ;
+
+
+
+
+extern int symlinkat (const char *__from, int __tofd,
+ const char *__to) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 3))) ;
+
+
+extern ssize_t readlinkat (int __fd, const char *__restrict __path,
+ char *__restrict __buf, size_t __len)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 3))) ;
+
+
+
+extern int unlink (const char *__name) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+extern int unlinkat (int __fd, const char *__name, int __flag)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+
+
+
+extern int rmdir (const char *__path) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+extern __pid_t tcgetpgrp (int __fd) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int tcsetpgrp (int __fd, __pid_t __pgrp_id) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+extern char *getlogin (void);
+
+
+
+
+
+
+
+extern int getlogin_r (char *__name, size_t __name_len) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+extern int setlogin (const char *__name) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+# 874 "/usr/include/unistd.h" 3 4
+# 1 "/usr/include/getopt.h" 1 3 4
+# 57 "/usr/include/getopt.h" 3 4
+extern char *optarg;
+# 71 "/usr/include/getopt.h" 3 4
+extern int optind;
+
+
+
+
+extern int opterr;
+
+
+
+extern int optopt;
+# 150 "/usr/include/getopt.h" 3 4
+extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
+ __attribute__ ((__nothrow__ , __leaf__));
+# 875 "/usr/include/unistd.h" 2 3 4
+
+
+
+
+
+
+
+extern int gethostname (char *__name, size_t __len) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+extern int sethostname (const char *__name, size_t __len)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+extern int sethostid (long int __id) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+
+extern int getdomainname (char *__name, size_t __len)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+extern int setdomainname (const char *__name, size_t __len)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+
+
+extern int vhangup (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int revoke (const char *__file) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+
+
+
+
+extern int profil (unsigned short int *__sample_buffer, size_t __size,
+ size_t __offset, unsigned int __scale)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+extern int acct (const char *__name) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern char *getusershell (void) __attribute__ ((__nothrow__ , __leaf__));
+extern void endusershell (void) __attribute__ ((__nothrow__ , __leaf__));
+extern void setusershell (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern int daemon (int __nochdir, int __noclose) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+
+
+extern int chroot (const char *__path) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+extern char *getpass (const char *__prompt) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+
+extern int fsync (int __fd);
+# 972 "/usr/include/unistd.h" 3 4
+extern long int gethostid (void);
+
+
+extern void sync (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern int getpagesize (void) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+
+
+
+
+extern int getdtablesize (void) __attribute__ ((__nothrow__ , __leaf__));
+# 996 "/usr/include/unistd.h" 3 4
+extern int truncate (const char *__file, __off_t __length)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+# 1019 "/usr/include/unistd.h" 3 4
+extern int ftruncate (int __fd, __off_t __length) __attribute__ ((__nothrow__ , __leaf__)) ;
+# 1040 "/usr/include/unistd.h" 3 4
+extern int brk (void *__addr) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+
+extern void *sbrk (intptr_t __delta) __attribute__ ((__nothrow__ , __leaf__));
+# 1061 "/usr/include/unistd.h" 3 4
+extern long int syscall (long int __sysno, ...) __attribute__ ((__nothrow__ , __leaf__));
+# 1084 "/usr/include/unistd.h" 3 4
+extern int lockf (int __fd, int __cmd, __off_t __len) ;
+# 1115 "/usr/include/unistd.h" 3 4
+extern int fdatasync (int __fildes);
+# 1154 "/usr/include/unistd.h" 3 4
+
+# 29 "../../../server-code/src/common/utils.h" 2
+# 39 "../../../server-code/src/common/utils.h"
+
+# 39 "../../../server-code/src/common/utils.h"
+void WriteDump(FILE* fp, const void* buffer, size_t length);
+void ShowDump(const void* buffer, size_t length);
+
+void findfile(const char *p, const char *pat, void (func)(const char*));
+
+# 43 "../../../server-code/src/common/utils.h" 3 4
+_Bool
+# 43 "../../../server-code/src/common/utils.h"
+ exists(const char* filename);
+
+
+unsigned int get_percentage(const unsigned int A, const unsigned int B);
+
+int64 apply_percentrate64(int64 value, int rate, int maxrate);
+int apply_percentrate(int value, int rate, int maxrate);
+
+const char* timestamp2string(char* str, size_t size, time_t timestamp, const char* format);
+
+
+
+
+
+extern uint8 GetByte(uint32 val, int idx);
+extern uint16 GetWord(uint32 val, int idx);
+extern uint16 MakeWord(uint8 byte0, uint8 byte1);
+extern uint32 MakeDWord(uint16 word0, uint16 word1);
+
+
+
+
+extern int16 MakeShortLE(int16 val);
+extern int32 MakeLongLE(int32 val);
+extern uint16 GetUShort(const unsigned char* buf);
+extern uint32 GetULong(const unsigned char* buf);
+extern int32 GetLong(const unsigned char* buf);
+extern float GetFloat(const unsigned char* buf);
+
+size_t hread(void * ptr, size_t size, size_t count, FILE * stream);
+size_t hwrite(const void * ptr, size_t size, size_t count, FILE * stream);
+# 83 "../../../server-code/src/common/utils.h"
+struct HCache_interface {
+ void (*init) (void);
+
+
+# 86 "../../../server-code/src/common/utils.h" 3 4
+_Bool
+# 86 "../../../server-code/src/common/utils.h"
+ (*check) (const char *file);
+ FILE *(*open) (const char *file, const char *opt);
+
+ time_t recompile_time;
+
+# 90 "../../../server-code/src/common/utils.h" 3 4
+_Bool
+# 90 "../../../server-code/src/common/utils.h"
+ enabled;
+};
+
+
+void HCache_defaults(void);
+
+
+extern struct HCache_interface *HCache;
+# 58 "../../../server-code/src/char/char.c" 2
+
+# 1 "/usr/include/signal.h" 1 3 4
+# 30 "/usr/include/signal.h" 3 4
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/sigset.h" 1 3 4
+# 22 "/usr/include/x86_64-linux-gnu/bits/sigset.h" 3 4
+
+# 22 "/usr/include/x86_64-linux-gnu/bits/sigset.h" 3 4
+typedef int __sig_atomic_t;
+
+
+
+
+typedef struct
+ {
+ unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))];
+ } __sigset_t;
+# 102 "/usr/include/x86_64-linux-gnu/bits/sigset.h" 3 4
+extern int __sigismember (const __sigset_t *, int);
+extern int __sigaddset (__sigset_t *, int);
+extern int __sigdelset (__sigset_t *, int);
+# 33 "/usr/include/signal.h" 2 3 4
+
+
+
+
+
+
+
+typedef __sig_atomic_t sig_atomic_t;
+
+
+
+
+
+
+
+
+typedef __sigset_t sigset_t;
+
+
+
+
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/signum.h" 1 3 4
+# 58 "/usr/include/signal.h" 2 3 4
+# 80 "/usr/include/signal.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 1 3 4
+# 24 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
+# 25 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 2 3 4
+
+
+
+
+
+
+
+typedef union sigval
+ {
+ int sival_int;
+ void *sival_ptr;
+ } sigval_t;
+# 58 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 3 4
+typedef __clock_t __sigchld_clock_t;
+
+
+
+typedef struct
+ {
+ int si_signo;
+ int si_errno;
+
+ int si_code;
+
+ union
+ {
+ int _pad[((128 / sizeof (int)) - 4)];
+
+
+ struct
+ {
+ __pid_t si_pid;
+ __uid_t si_uid;
+ } _kill;
+
+
+ struct
+ {
+ int si_tid;
+ int si_overrun;
+ sigval_t si_sigval;
+ } _timer;
+
+
+ struct
+ {
+ __pid_t si_pid;
+ __uid_t si_uid;
+ sigval_t si_sigval;
+ } _rt;
+
+
+ struct
+ {
+ __pid_t si_pid;
+ __uid_t si_uid;
+ int si_status;
+ __sigchld_clock_t si_utime;
+ __sigchld_clock_t si_stime;
+ } _sigchld;
+
+
+ struct
+ {
+ void *si_addr;
+ short int si_addr_lsb;
+ struct
+ {
+ void *_lower;
+ void *_upper;
+ } si_addr_bnd;
+ } _sigfault;
+
+
+ struct
+ {
+ long int si_band;
+ int si_fd;
+ } _sigpoll;
+
+
+ struct
+ {
+ void *_call_addr;
+ int _syscall;
+ unsigned int _arch;
+ } _sigsys;
+ } _sifields;
+ } siginfo_t ;
+# 160 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 3 4
+enum
+{
+ SI_ASYNCNL = -60,
+
+ SI_TKILL = -6,
+
+ SI_SIGIO,
+
+ SI_ASYNCIO,
+
+ SI_MESGQ,
+
+ SI_TIMER,
+
+ SI_QUEUE,
+
+ SI_USER,
+
+ SI_KERNEL = 0x80
+
+};
+
+
+
+
+enum
+{
+ ILL_ILLOPC = 1,
+
+ ILL_ILLOPN,
+
+ ILL_ILLADR,
+
+ ILL_ILLTRP,
+
+ ILL_PRVOPC,
+
+ ILL_PRVREG,
+
+ ILL_COPROC,
+
+ ILL_BADSTK
+
+};
+
+
+enum
+{
+ FPE_INTDIV = 1,
+
+ FPE_INTOVF,
+
+ FPE_FLTDIV,
+
+ FPE_FLTOVF,
+
+ FPE_FLTUND,
+
+ FPE_FLTRES,
+
+ FPE_FLTINV,
+
+ FPE_FLTSUB
+
+};
+
+
+enum
+{
+ SEGV_MAPERR = 1,
+
+ SEGV_ACCERR
+
+};
+
+
+enum
+{
+ BUS_ADRALN = 1,
+
+ BUS_ADRERR,
+
+ BUS_OBJERR,
+
+ BUS_MCEERR_AR,
+
+ BUS_MCEERR_AO
+
+};
+# 264 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 3 4
+enum
+{
+ CLD_EXITED = 1,
+
+ CLD_KILLED,
+
+ CLD_DUMPED,
+
+ CLD_TRAPPED,
+
+ CLD_STOPPED,
+
+ CLD_CONTINUED
+
+};
+
+
+enum
+{
+ POLL_IN = 1,
+
+ POLL_OUT,
+
+ POLL_MSG,
+
+ POLL_ERR,
+
+ POLL_PRI,
+
+ POLL_HUP
+
+};
+# 316 "/usr/include/x86_64-linux-gnu/bits/siginfo.h" 3 4
+typedef union pthread_attr_t pthread_attr_t;
+
+
+
+typedef struct sigevent
+ {
+ sigval_t sigev_value;
+ int sigev_signo;
+ int sigev_notify;
+
+ union
+ {
+ int _pad[((64 / sizeof (int)) - 4)];
+
+
+
+ __pid_t _tid;
+
+ struct
+ {
+ void (*_function) (sigval_t);
+ pthread_attr_t *_attribute;
+ } _sigev_thread;
+ } _sigev_un;
+ } sigevent_t;
+
+
+
+
+
+
+enum
+{
+ SIGEV_SIGNAL = 0,
+
+ SIGEV_NONE,
+
+ SIGEV_THREAD,
+
+
+ SIGEV_THREAD_ID = 4
+
+};
+# 81 "/usr/include/signal.h" 2 3 4
+
+
+
+
+typedef void (*__sighandler_t) (int);
+
+
+
+
+extern __sighandler_t __sysv_signal (int __sig, __sighandler_t __handler)
+ __attribute__ ((__nothrow__ , __leaf__));
+# 100 "/usr/include/signal.h" 3 4
+
+
+extern __sighandler_t signal (int __sig, __sighandler_t __handler)
+ __attribute__ ((__nothrow__ , __leaf__));
+# 114 "/usr/include/signal.h" 3 4
+
+# 127 "/usr/include/signal.h" 3 4
+extern int kill (__pid_t __pid, int __sig) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+extern int killpg (__pid_t __pgrp, int __sig) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern int raise (int __sig) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern __sighandler_t ssignal (int __sig, __sighandler_t __handler)
+ __attribute__ ((__nothrow__ , __leaf__));
+extern int gsignal (int __sig) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern void psignal (int __sig, const char *__s);
+
+
+extern void psiginfo (const siginfo_t *__pinfo, const char *__s);
+# 187 "/usr/include/signal.h" 3 4
+extern int sigblock (int __mask) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__deprecated__));
+
+
+extern int sigsetmask (int __mask) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__deprecated__));
+
+
+extern int siggetmask (void) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__deprecated__));
+# 207 "/usr/include/signal.h" 3 4
+typedef __sighandler_t sig_t;
+
+
+
+
+
+extern int sigemptyset (sigset_t *__set) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern int sigfillset (sigset_t *__set) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern int sigaddset (sigset_t *__set, int __signo) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern int sigdelset (sigset_t *__set, int __signo) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern int sigismember (const sigset_t *__set, int __signo)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+# 243 "/usr/include/signal.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/sigaction.h" 1 3 4
+# 24 "/usr/include/x86_64-linux-gnu/bits/sigaction.h" 3 4
+struct sigaction
+ {
+
+
+ union
+ {
+
+ __sighandler_t sa_handler;
+
+ void (*sa_sigaction) (int, siginfo_t *, void *);
+ }
+ __sigaction_handler;
+
+
+
+
+
+
+
+ __sigset_t sa_mask;
+
+
+ int sa_flags;
+
+
+ void (*sa_restorer) (void);
+ };
+# 244 "/usr/include/signal.h" 2 3 4
+
+
+extern int sigprocmask (int __how, const sigset_t *__restrict __set,
+ sigset_t *__restrict __oset) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+extern int sigsuspend (const sigset_t *__set) __attribute__ ((__nonnull__ (1)));
+
+
+extern int sigaction (int __sig, const struct sigaction *__restrict __act,
+ struct sigaction *__restrict __oact) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int sigpending (sigset_t *__set) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+extern int sigwait (const sigset_t *__restrict __set, int *__restrict __sig)
+ __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+
+
+extern int sigwaitinfo (const sigset_t *__restrict __set,
+ siginfo_t *__restrict __info) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+extern int sigtimedwait (const sigset_t *__restrict __set,
+ siginfo_t *__restrict __info,
+ const struct timespec *__restrict __timeout)
+ __attribute__ ((__nonnull__ (1)));
+
+
+
+extern int sigqueue (__pid_t __pid, int __sig, const union sigval __val)
+ __attribute__ ((__nothrow__ , __leaf__));
+# 301 "/usr/include/signal.h" 3 4
+extern const char *const _sys_siglist[65];
+extern const char *const sys_siglist[65];
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/sigcontext.h" 1 3 4
+# 29 "/usr/include/x86_64-linux-gnu/bits/sigcontext.h" 3 4
+struct _fpx_sw_bytes
+{
+ __uint32_t magic1;
+ __uint32_t extended_size;
+ __uint64_t xstate_bv;
+ __uint32_t xstate_size;
+ __uint32_t padding[7];
+};
+
+struct _fpreg
+{
+ unsigned short significand[4];
+ unsigned short exponent;
+};
+
+struct _fpxreg
+{
+ unsigned short significand[4];
+ unsigned short exponent;
+ unsigned short padding[3];
+};
+
+struct _xmmreg
+{
+ __uint32_t element[4];
+};
+# 121 "/usr/include/x86_64-linux-gnu/bits/sigcontext.h" 3 4
+struct _fpstate
+{
+
+ __uint16_t cwd;
+ __uint16_t swd;
+ __uint16_t ftw;
+ __uint16_t fop;
+ __uint64_t rip;
+ __uint64_t rdp;
+ __uint32_t mxcsr;
+ __uint32_t mxcr_mask;
+ struct _fpxreg _st[8];
+ struct _xmmreg _xmm[16];
+ __uint32_t padding[24];
+};
+
+struct sigcontext
+{
+ __uint64_t r8;
+ __uint64_t r9;
+ __uint64_t r10;
+ __uint64_t r11;
+ __uint64_t r12;
+ __uint64_t r13;
+ __uint64_t r14;
+ __uint64_t r15;
+ __uint64_t rdi;
+ __uint64_t rsi;
+ __uint64_t rbp;
+ __uint64_t rbx;
+ __uint64_t rdx;
+ __uint64_t rax;
+ __uint64_t rcx;
+ __uint64_t rsp;
+ __uint64_t rip;
+ __uint64_t eflags;
+ unsigned short cs;
+ unsigned short gs;
+ unsigned short fs;
+ unsigned short __pad0;
+ __uint64_t err;
+ __uint64_t trapno;
+ __uint64_t oldmask;
+ __uint64_t cr2;
+ __extension__ union
+ {
+ struct _fpstate * fpstate;
+ __uint64_t __fpstate_word;
+ };
+ __uint64_t __reserved1 [8];
+};
+
+
+
+struct _xsave_hdr
+{
+ __uint64_t xstate_bv;
+ __uint64_t reserved1[2];
+ __uint64_t reserved2[5];
+};
+
+struct _ymmh_state
+{
+ __uint32_t ymmh_space[64];
+};
+
+struct _xstate
+{
+ struct _fpstate fpstate;
+ struct _xsave_hdr xstate_hdr;
+ struct _ymmh_state ymmh;
+};
+# 307 "/usr/include/signal.h" 2 3 4
+
+
+extern int sigreturn (struct sigcontext *__scp) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 317 "/usr/include/signal.h" 2 3 4
+
+
+
+
+extern int siginterrupt (int __sig, int __interrupt) __attribute__ ((__nothrow__ , __leaf__));
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/sigstack.h" 1 3 4
+# 25 "/usr/include/x86_64-linux-gnu/bits/sigstack.h" 3 4
+struct sigstack
+ {
+ void *ss_sp;
+ int ss_onstack;
+ };
+
+
+
+enum
+{
+ SS_ONSTACK = 1,
+
+ SS_DISABLE
+
+};
+# 49 "/usr/include/x86_64-linux-gnu/bits/sigstack.h" 3 4
+typedef struct sigaltstack
+ {
+ void *ss_sp;
+ int ss_flags;
+ size_t ss_size;
+ } stack_t;
+# 324 "/usr/include/signal.h" 2 3 4
+
+
+# 1 "/usr/include/x86_64-linux-gnu/sys/ucontext.h" 1 3 4
+# 22 "/usr/include/x86_64-linux-gnu/sys/ucontext.h" 3 4
+# 1 "/usr/include/signal.h" 1 3 4
+# 23 "/usr/include/x86_64-linux-gnu/sys/ucontext.h" 2 3 4
+# 31 "/usr/include/x86_64-linux-gnu/sys/ucontext.h" 3 4
+__extension__ typedef long long int greg_t;
+
+
+
+
+
+typedef greg_t gregset_t[23];
+# 92 "/usr/include/x86_64-linux-gnu/sys/ucontext.h" 3 4
+struct _libc_fpxreg
+{
+ unsigned short int significand[4];
+ unsigned short int exponent;
+ unsigned short int padding[3];
+};
+
+struct _libc_xmmreg
+{
+ __uint32_t element[4];
+};
+
+struct _libc_fpstate
+{
+
+ __uint16_t cwd;
+ __uint16_t swd;
+ __uint16_t ftw;
+ __uint16_t fop;
+ __uint64_t rip;
+ __uint64_t rdp;
+ __uint32_t mxcsr;
+ __uint32_t mxcr_mask;
+ struct _libc_fpxreg _st[8];
+ struct _libc_xmmreg _xmm[16];
+ __uint32_t padding[24];
+};
+
+
+typedef struct _libc_fpstate *fpregset_t;
+
+
+typedef struct
+ {
+ gregset_t gregs;
+
+ fpregset_t fpregs;
+ __extension__ unsigned long long __reserved1 [8];
+} mcontext_t;
+
+
+typedef struct ucontext
+ {
+ unsigned long int uc_flags;
+ struct ucontext *uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ __sigset_t uc_sigmask;
+ struct _libc_fpstate __fpregs_mem;
+ } ucontext_t;
+# 327 "/usr/include/signal.h" 2 3 4
+
+
+
+
+
+extern int sigstack (struct sigstack *__ss, struct sigstack *__oss)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__deprecated__));
+
+
+
+extern int sigaltstack (const struct sigaltstack *__restrict __ss,
+ struct sigaltstack *__restrict __oss) __attribute__ ((__nothrow__ , __leaf__));
+# 361 "/usr/include/signal.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 1 3 4
+# 21 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
+# 22 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 2 3 4
+# 60 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
+typedef unsigned long int pthread_t;
+
+
+union pthread_attr_t
+{
+ char __size[56];
+ long int __align;
+};
+
+
+
+
+
+
+
+typedef struct __pthread_internal_list
+{
+ struct __pthread_internal_list *__prev;
+ struct __pthread_internal_list *__next;
+} __pthread_list_t;
+# 90 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
+typedef union
+{
+ struct __pthread_mutex_s
+ {
+ int __lock;
+ unsigned int __count;
+ int __owner;
+
+ unsigned int __nusers;
+
+
+
+ int __kind;
+
+ short __spins;
+ short __elision;
+ __pthread_list_t __list;
+# 125 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
+ } __data;
+ char __size[40];
+ long int __align;
+} pthread_mutex_t;
+
+typedef union
+{
+ char __size[4];
+ int __align;
+} pthread_mutexattr_t;
+
+
+
+
+typedef union
+{
+ struct
+ {
+ int __lock;
+ unsigned int __futex;
+ __extension__ unsigned long long int __total_seq;
+ __extension__ unsigned long long int __wakeup_seq;
+ __extension__ unsigned long long int __woken_seq;
+ void *__mutex;
+ unsigned int __nwaiters;
+ unsigned int __broadcast_seq;
+ } __data;
+ char __size[48];
+ __extension__ long long int __align;
+} pthread_cond_t;
+
+typedef union
+{
+ char __size[4];
+ int __align;
+} pthread_condattr_t;
+
+
+
+typedef unsigned int pthread_key_t;
+
+
+
+typedef int pthread_once_t;
+
+
+
+
+
+typedef union
+{
+
+ struct
+ {
+ int __lock;
+ unsigned int __nr_readers;
+ unsigned int __readers_wakeup;
+ unsigned int __writer_wakeup;
+ unsigned int __nr_readers_queued;
+ unsigned int __nr_writers_queued;
+ int __writer;
+ int __shared;
+ signed char __rwelision;
+
+
+
+
+ unsigned char __pad1[7];
+
+
+ unsigned long int __pad2;
+
+
+ unsigned int __flags;
+
+ } __data;
+# 220 "/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h" 3 4
+ char __size[56];
+ long int __align;
+} pthread_rwlock_t;
+
+typedef union
+{
+ char __size[8];
+ long int __align;
+} pthread_rwlockattr_t;
+
+
+
+
+
+typedef volatile int pthread_spinlock_t;
+
+
+
+
+typedef union
+{
+ char __size[32];
+ long int __align;
+} pthread_barrier_t;
+
+typedef union
+{
+ char __size[4];
+ int __align;
+} pthread_barrierattr_t;
+# 362 "/usr/include/signal.h" 2 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/sigthread.h" 1 3 4
+# 30 "/usr/include/x86_64-linux-gnu/bits/sigthread.h" 3 4
+extern int pthread_sigmask (int __how,
+ const __sigset_t *__restrict __newmask,
+ __sigset_t *__restrict __oldmask)__attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int pthread_kill (pthread_t __threadid, int __signo) __attribute__ ((__nothrow__ , __leaf__));
+# 363 "/usr/include/signal.h" 2 3 4
+
+
+
+
+
+
+extern int __libc_current_sigrtmin (void) __attribute__ ((__nothrow__ , __leaf__));
+
+extern int __libc_current_sigrtmax (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+# 60 "../../../server-code/src/char/char.c" 2
+
+
+# 1 "/usr/include/stdlib.h" 1 3 4
+# 32 "/usr/include/stdlib.h" 3 4
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 33 "/usr/include/stdlib.h" 2 3 4
+
+
+
+
+
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/waitflags.h" 1 3 4
+# 50 "/usr/include/x86_64-linux-gnu/bits/waitflags.h" 3 4
+typedef enum
+{
+ P_ALL,
+ P_PID,
+ P_PGID
+} idtype_t;
+# 42 "/usr/include/stdlib.h" 2 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/waitstatus.h" 1 3 4
+# 66 "/usr/include/x86_64-linux-gnu/bits/waitstatus.h" 3 4
+union wait
+ {
+ int w_status;
+ struct
+ {
+
+ unsigned int __w_termsig:7;
+ unsigned int __w_coredump:1;
+ unsigned int __w_retcode:8;
+ unsigned int:16;
+
+
+
+
+
+
+
+ } __wait_terminated;
+ struct
+ {
+
+ unsigned int __w_stopval:8;
+ unsigned int __w_stopsig:8;
+ unsigned int:16;
+
+
+
+
+
+
+ } __wait_stopped;
+ };
+# 43 "/usr/include/stdlib.h" 2 3 4
+# 67 "/usr/include/stdlib.h" 3 4
+typedef union
+ {
+ union wait *__uptr;
+ int *__iptr;
+ } __WAIT_STATUS __attribute__ ((__transparent_union__));
+# 95 "/usr/include/stdlib.h" 3 4
+
+
+typedef struct
+ {
+ int quot;
+ int rem;
+ } div_t;
+
+
+
+typedef struct
+ {
+ long int quot;
+ long int rem;
+ } ldiv_t;
+
+
+
+
+
+
+
+__extension__ typedef struct
+ {
+ long long int quot;
+ long long int rem;
+ } lldiv_t;
+
+
+# 139 "/usr/include/stdlib.h" 3 4
+extern size_t __ctype_get_mb_cur_max (void) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+extern double atof (const char *__nptr)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
+
+extern int atoi (const char *__nptr)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
+
+extern long int atol (const char *__nptr)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+
+
+__extension__ extern long long int atoll (const char *__nptr)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+
+
+extern double strtod (const char *__restrict __nptr,
+ char **__restrict __endptr)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+extern float strtof (const char *__restrict __nptr,
+ char **__restrict __endptr) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+extern long double strtold (const char *__restrict __nptr,
+ char **__restrict __endptr)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+extern long int strtol (const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+extern unsigned long int strtoul (const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+__extension__
+extern long long int strtoq (const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+__extension__
+extern unsigned long long int strtouq (const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+__extension__
+extern long long int strtoll (const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+__extension__
+extern unsigned long long int strtoull (const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+# 305 "/usr/include/stdlib.h" 3 4
+extern char *l64a (long int __n) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+extern long int a64l (const char *__s)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+
+# 1 "/usr/include/x86_64-linux-gnu/sys/types.h" 1 3 4
+# 27 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+
+
+
+
+
+
+typedef __u_char u_char;
+typedef __u_short u_short;
+typedef __u_int u_int;
+typedef __u_long u_long;
+typedef __quad_t quad_t;
+typedef __u_quad_t u_quad_t;
+typedef __fsid_t fsid_t;
+
+
+
+
+typedef __loff_t loff_t;
+
+
+
+typedef __ino_t ino_t;
+# 60 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+typedef __dev_t dev_t;
+# 70 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+typedef __mode_t mode_t;
+
+
+
+
+typedef __nlink_t nlink_t;
+# 104 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+typedef __id_t id_t;
+# 115 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+typedef __daddr_t daddr_t;
+typedef __caddr_t caddr_t;
+
+
+
+
+
+typedef __key_t key_t;
+# 146 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 147 "/usr/include/x86_64-linux-gnu/sys/types.h" 2 3 4
+
+
+
+typedef unsigned long int ulong;
+typedef unsigned short int ushort;
+typedef unsigned int uint;
+# 200 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__)));
+typedef unsigned int u_int16_t __attribute__ ((__mode__ (__HI__)));
+typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__)));
+typedef unsigned int u_int64_t __attribute__ ((__mode__ (__DI__)));
+
+typedef int register_t __attribute__ ((__mode__ (__word__)));
+# 219 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/sys/select.h" 1 3 4
+# 30 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/select.h" 1 3 4
+# 22 "/usr/include/x86_64-linux-gnu/bits/select.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
+# 23 "/usr/include/x86_64-linux-gnu/bits/select.h" 2 3 4
+# 31 "/usr/include/x86_64-linux-gnu/sys/select.h" 2 3 4
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/sigset.h" 1 3 4
+# 34 "/usr/include/x86_64-linux-gnu/sys/select.h" 2 3 4
+# 45 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
+# 1 "/usr/include/x86_64-linux-gnu/bits/time.h" 1 3 4
+# 30 "/usr/include/x86_64-linux-gnu/bits/time.h" 3 4
+struct timeval
+ {
+ __time_t tv_sec;
+ __suseconds_t tv_usec;
+ };
+# 46 "/usr/include/x86_64-linux-gnu/sys/select.h" 2 3 4
+
+
+typedef __suseconds_t suseconds_t;
+
+
+
+
+
+typedef long int __fd_mask;
+# 64 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
+typedef struct
+ {
+
+
+
+
+
+
+ __fd_mask __fds_bits[1024 / (8 * (int) sizeof (__fd_mask))];
+
+
+ } fd_set;
+
+
+
+
+
+
+typedef __fd_mask fd_mask;
+# 96 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
+
+# 106 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
+extern int select (int __nfds, fd_set *__restrict __readfds,
+ fd_set *__restrict __writefds,
+ fd_set *__restrict __exceptfds,
+ struct timeval *__restrict __timeout);
+# 118 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
+extern int pselect (int __nfds, fd_set *__restrict __readfds,
+ fd_set *__restrict __writefds,
+ fd_set *__restrict __exceptfds,
+ const struct timespec *__restrict __timeout,
+ const __sigset_t *__restrict __sigmask);
+# 131 "/usr/include/x86_64-linux-gnu/sys/select.h" 3 4
+
+# 220 "/usr/include/x86_64-linux-gnu/sys/types.h" 2 3 4
+
+
+# 1 "/usr/include/x86_64-linux-gnu/sys/sysmacros.h" 1 3 4
+# 24 "/usr/include/x86_64-linux-gnu/sys/sysmacros.h" 3 4
+
+
+__extension__
+extern unsigned int gnu_dev_major (unsigned long long int __dev)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+__extension__
+extern unsigned int gnu_dev_minor (unsigned long long int __dev)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+__extension__
+extern unsigned long long int gnu_dev_makedev (unsigned int __major,
+ unsigned int __minor)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
+# 58 "/usr/include/x86_64-linux-gnu/sys/sysmacros.h" 3 4
+
+# 223 "/usr/include/x86_64-linux-gnu/sys/types.h" 2 3 4
+
+
+
+
+
+typedef __blksize_t blksize_t;
+
+
+
+
+
+
+typedef __blkcnt_t blkcnt_t;
+
+
+
+typedef __fsblkcnt_t fsblkcnt_t;
+
+
+
+typedef __fsfilcnt_t fsfilcnt_t;
+# 273 "/usr/include/x86_64-linux-gnu/sys/types.h" 3 4
+
+# 315 "/usr/include/stdlib.h" 2 3 4
+
+
+
+
+
+
+extern long int random (void) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern void srandom (unsigned int __seed) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+extern char *initstate (unsigned int __seed, char *__statebuf,
+ size_t __statelen) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+
+
+
+extern char *setstate (char *__statebuf) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+
+struct random_data
+ {
+ int32_t *fptr;
+ int32_t *rptr;
+ int32_t *state;
+ int rand_type;
+ int rand_deg;
+ int rand_sep;
+ int32_t *end_ptr;
+ };
+
+extern int random_r (struct random_data *__restrict __buf,
+ int32_t *__restrict __result) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+extern int srandom_r (unsigned int __seed, struct random_data *__buf)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+
+extern int initstate_r (unsigned int __seed, char *__restrict __statebuf,
+ size_t __statelen,
+ struct random_data *__restrict __buf)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 4)));
+
+extern int setstate_r (char *__restrict __statebuf,
+ struct random_data *__restrict __buf)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+
+
+extern int rand (void) __attribute__ ((__nothrow__ , __leaf__));
+
+extern void srand (unsigned int __seed) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern int rand_r (unsigned int *__seed) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+
+extern double drand48 (void) __attribute__ ((__nothrow__ , __leaf__));
+extern double erand48 (unsigned short int __xsubi[3]) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern long int lrand48 (void) __attribute__ ((__nothrow__ , __leaf__));
+extern long int nrand48 (unsigned short int __xsubi[3])
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern long int mrand48 (void) __attribute__ ((__nothrow__ , __leaf__));
+extern long int jrand48 (unsigned short int __xsubi[3])
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+extern void srand48 (long int __seedval) __attribute__ ((__nothrow__ , __leaf__));
+extern unsigned short int *seed48 (unsigned short int __seed16v[3])
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+extern void lcong48 (unsigned short int __param[7]) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+struct drand48_data
+ {
+ unsigned short int __x[3];
+ unsigned short int __old_x[3];
+ unsigned short int __c;
+ unsigned short int __init;
+ __extension__ unsigned long long int __a;
+
+ };
+
+
+extern int drand48_r (struct drand48_data *__restrict __buffer,
+ double *__restrict __result) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+extern int erand48_r (unsigned short int __xsubi[3],
+ struct drand48_data *__restrict __buffer,
+ double *__restrict __result) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern int lrand48_r (struct drand48_data *__restrict __buffer,
+ long int *__restrict __result)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+extern int nrand48_r (unsigned short int __xsubi[3],
+ struct drand48_data *__restrict __buffer,
+ long int *__restrict __result)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern int mrand48_r (struct drand48_data *__restrict __buffer,
+ long int *__restrict __result)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+extern int jrand48_r (unsigned short int __xsubi[3],
+ struct drand48_data *__restrict __buffer,
+ long int *__restrict __result)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+extern int srand48_r (long int __seedval, struct drand48_data *__buffer)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+
+extern int seed48_r (unsigned short int __seed16v[3],
+ struct drand48_data *__buffer) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+extern int lcong48_r (unsigned short int __param[7],
+ struct drand48_data *__buffer)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
+
+
+
+
+
+
+
+
+
+extern void *malloc (size_t __size) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ;
+
+extern void *calloc (size_t __nmemb, size_t __size)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ;
+
+
+
+
+
+
+
+
+
+
+extern void *realloc (void *__ptr, size_t __size)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__warn_unused_result__));
+
+extern void free (void *__ptr) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+extern void cfree (void *__ptr) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+# 1 "/usr/include/alloca.h" 1 3 4
+# 24 "/usr/include/alloca.h" 3 4
+# 1 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 1 3 4
+# 25 "/usr/include/alloca.h" 2 3 4
+
+
+
+
+
+
+
+extern void *alloca (size_t __size) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+# 493 "/usr/include/stdlib.h" 2 3 4
+
+
+
+
+
+extern void *valloc (size_t __size) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ;
+
+
+
+
+extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+
+
+
+extern void *aligned_alloc (size_t __alignment, size_t __size)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) __attribute__ ((__alloc_size__ (2))) ;
+
+
+
+
+extern void abort (void) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__noreturn__));
+
+
+
+extern int atexit (void (*__func) (void)) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+
+extern int at_quick_exit (void (*__func) (void)) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+
+extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+extern void exit (int __status) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__noreturn__));
+
+
+
+
+
+extern void quick_exit (int __status) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__noreturn__));
+
+
+
+
+
+
+
+extern void _Exit (int __status) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__noreturn__));
+
+
+
+
+
+
+extern char *getenv (const char *__name) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+
+# 578 "/usr/include/stdlib.h" 3 4
+extern int putenv (char *__string) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+extern int setenv (const char *__name, const char *__value, int __replace)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));
+
+
+extern int unsetenv (const char *__name) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+
+
+
+
+extern int clearenv (void) __attribute__ ((__nothrow__ , __leaf__));
+# 606 "/usr/include/stdlib.h" 3 4
+extern char *mktemp (char *__template) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+# 619 "/usr/include/stdlib.h" 3 4
+extern int mkstemp (char *__template) __attribute__ ((__nonnull__ (1))) ;
+# 641 "/usr/include/stdlib.h" 3 4
+extern int mkstemps (char *__template, int __suffixlen) __attribute__ ((__nonnull__ (1))) ;
+# 662 "/usr/include/stdlib.h" 3 4
+extern char *mkdtemp (char *__template) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+# 711 "/usr/include/stdlib.h" 3 4
+
+
+
+
+
+extern int system (const char *__command) ;
+
+# 733 "/usr/include/stdlib.h" 3 4
+extern char *realpath (const char *__restrict __name,
+ char *__restrict __resolved) __attribute__ ((__nothrow__ , __leaf__)) ;
+
+
+
+
+
+
+typedef int (*__compar_fn_t) (const void *, const void *);
+# 751 "/usr/include/stdlib.h" 3 4
+
+
+
+extern void *bsearch (const void *__key, const void *__base,
+ size_t __nmemb, size_t __size, __compar_fn_t __compar)
+ __attribute__ ((__nonnull__ (1, 2, 5))) ;
+
+
+
+
+
+
+
+extern void qsort (void *__base, size_t __nmemb, size_t __size,
+ __compar_fn_t __compar) __attribute__ ((__nonnull__ (1, 4)));
+# 774 "/usr/include/stdlib.h" 3 4
+extern int abs (int __x) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__)) ;
+extern long int labs (long int __x) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__)) ;
+
+
+
+__extension__ extern long long int llabs (long long int __x)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__)) ;
+
+
+
+
+
+
+
+extern div_t div (int __numer, int __denom)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__)) ;
+extern ldiv_t ldiv (long int __numer, long int __denom)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__)) ;
+
+
+
+
+__extension__ extern lldiv_t lldiv (long long int __numer,
+ long long int __denom)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__)) ;
+
+# 811 "/usr/include/stdlib.h" 3 4
+extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt,
+ int *__restrict __sign) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3, 4))) ;
+
+
+
+
+extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt,
+ int *__restrict __sign) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3, 4))) ;
+
+
+
+
+extern char *gcvt (double __value, int __ndigit, char *__buf)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3))) ;
+
+
+
+
+extern char *qecvt (long double __value, int __ndigit,
+ int *__restrict __decpt, int *__restrict __sign)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3, 4))) ;
+extern char *qfcvt (long double __value, int __ndigit,
+ int *__restrict __decpt, int *__restrict __sign)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3, 4))) ;
+extern char *qgcvt (long double __value, int __ndigit, char *__buf)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3))) ;
+
+
+
+
+extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt,
+ int *__restrict __sign, char *__restrict __buf,
+ size_t __len) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3, 4, 5)));
+extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt,
+ int *__restrict __sign, char *__restrict __buf,
+ size_t __len) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3, 4, 5)));
+
+extern int qecvt_r (long double __value, int __ndigit,
+ int *__restrict __decpt, int *__restrict __sign,
+ char *__restrict __buf, size_t __len)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3, 4, 5)));
+extern int qfcvt_r (long double __value, int __ndigit,
+ int *__restrict __decpt, int *__restrict __sign,
+ char *__restrict __buf, size_t __len)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (3, 4, 5)));
+
+
+
+
+
+
+extern int mblen (const char *__s, size_t __n) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int mbtowc (wchar_t *__restrict __pwc,
+ const char *__restrict __s, size_t __n) __attribute__ ((__nothrow__ , __leaf__));
+
+
+extern int wctomb (char *__s, wchar_t __wchar) __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+extern size_t mbstowcs (wchar_t *__restrict __pwcs,
+ const char *__restrict __s, size_t __n) __attribute__ ((__nothrow__ , __leaf__));
+
+extern size_t wcstombs (char *__restrict __s,
+ const wchar_t *__restrict __pwcs, size_t __n)
+ __attribute__ ((__nothrow__ , __leaf__));
+
+
+
+
+
+
+
+
+extern int rpmatch (const char *__response) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1))) ;
+# 898 "/usr/include/stdlib.h" 3 4
+extern int getsubopt (char **__restrict __optionp,
+ char *const *__restrict __tokens,
+ char **__restrict __valuep)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2, 3))) ;
+# 950 "/usr/include/stdlib.h" 3 4
+extern int getloadavg (double __loadavg[], int __nelem)
+ __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+
+# 1 "/usr/include/x86_64-linux-gnu/bits/stdlib-float.h" 1 3 4
+# 955 "/usr/include/stdlib.h" 2 3 4
+# 967 "/usr/include/stdlib.h" 3 4
+
+# 63 "../../../server-code/src/char/char.c" 2
+
+
+
+
+# 66 "../../../server-code/src/char/char.c"
+char char_db[256] = "char";
+char scdata_db[256] = "sc_data";
+char cart_db[256] = "cart_inventory";
+char inventory_db[256] = "inventory";
+char charlog_db[256] = "charlog";
+char storage_db[256] = "storage";
+char interlog_db[256] = "interlog";
+char skill_db[256] = "skill";
+char memo_db[256] = "memo";
+char guild_db[256] = "guild";
+char guild_alliance_db[256] = "guild_alliance";
+char guild_castle_db[256] = "guild_castle";
+char guild_expulsion_db[256] = "guild_expulsion";
+char guild_member_db[256] = "guild_member";
+char guild_position_db[256] = "guild_position";
+char guild_skill_db[256] = "guild_skill";
+char guild_storage_db[256] = "guild_storage";
+char party_db[256] = "party";
+char pet_db[256] = "pet";
+char mail_db[256] = "mail";
+char auction_db[256] = "auction";
+char friend_db[256] = "friends";
+char hotkey_db[256] = "hotkey";
+char quest_db[256] = "quest";
+char homunculus_db[256] = "homunculus";
+char skill_homunculus_db[256] = "skill_homunculus";
+char mercenary_db[256] = "mercenary";
+char mercenary_owner_db[256] = "mercenary_owner";
+char ragsrvinfo_db[256] = "ragsrvinfo";
+char elemental_db[256] = "elemental";
+char account_data_db[256] = "account_data";
+char acc_reg_num_db[32] = "acc_reg_num_db";
+char acc_reg_str_db[32] = "acc_reg_str_db";
+char char_reg_str_db[32] = "char_reg_str_db";
+char char_reg_num_db[32] = "char_reg_num_db";
+
+struct char_interface char_s;
+struct char_interface *chr;
+
+
+int save_log = 1;
+
+char db_path[1024] = "db";
+
+char wisp_server_name[(23 + 1)] = "Server";
+char login_ip_str[128];
+uint32 login_ip = 0;
+uint16 login_port = 6900;
+char char_ip_str[128];
+char bind_ip_str[128];
+uint32 bind_ip = INADDR_ANY;
+int char_maintenance_min_group_id = 0;
+
+# 118 "../../../server-code/src/char/char.c" 3 4
+_Bool
+# 118 "../../../server-code/src/char/char.c"
+ char_new =
+# 118 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 118 "../../../server-code/src/char/char.c"
+ ;
+
+
+# 120 "../../../server-code/src/char/char.c" 3 4
+_Bool
+# 120 "../../../server-code/src/char/char.c"
+ name_ignoring_case =
+# 120 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 120 "../../../server-code/src/char/char.c"
+ ;
+int char_name_option = 0;
+char unknown_char_name[(23 + 1)] = "Unknown";
+
+char char_name_letters[1024] = "";
+
+int char_del_level = 0;
+int char_del_delay = 86400;
+
+int log_char = 1;
+int log_inter = 1;
+
+int char_aegis_delete = 0;
+
+int max_connect_user = -1;
+int gm_allow_group = -1;
+int autosave_interval = (300*1000);
+int start_zeny = 0;
+int start_items[32*3];
+int guild_exp_rate = 100;
+
+
+int fame_list_size_chemist = 10;
+int fame_list_size_smith = 10;
+int fame_list_size_taekwon = 10;
+
+
+struct fame_list smith_fame_list[10];
+struct fame_list chemist_fame_list[10];
+struct fame_list taekwon_fame_list[10];
+
+
+
+ struct point start_point = { 0, 97, 90 };
+
+
+
+
+unsigned short skillid2idx[10015];
+
+
+
+
+
+
+static struct DBMap *auth_db;
+# 174 "../../../server-code/src/char/char.c"
+static struct DBData char_create_online_char_data(union DBKey key, va_list args)
+{
+ struct online_char_data* character;
+ ((character) = (struct online_char_data *) (iMalloc->calloc(((1)),(sizeof(struct online_char_data)),"../../../server-code/src/char/char.c", 177, __func__)));
+ character->account_id = key.i;
+ character->char_id = -1;
+ character->server = -1;
+ character->pincode_enable = -1;
+ character->fd = -1;
+ character->waiting_disconnect = (-1);
+ return DB->ptr2data(character);
+}
+
+void char_set_account_online(int account_id)
+{
+ WFIFOHEAD(chr->login_fd,6);
+ WFIFOW(chr->login_fd,0) = 0x272b;
+ WFIFOL(chr->login_fd,2) = account_id;
+ WFIFOSET(chr->login_fd,6);
+}
+
+void char_set_account_offline(int account_id)
+{
+ WFIFOHEAD(chr->login_fd,6);
+ WFIFOW(chr->login_fd,0) = 0x272c;
+ WFIFOL(chr->login_fd,2) = account_id;
+ WFIFOSET(chr->login_fd,6);
+}
+
+void char_set_char_charselect(int account_id)
+{
+ struct online_char_data* character;
+
+ character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->ensure((chr->online_char_db),DB->i2key(account_id),(chr->create_online_char_data))) );
+
+ if( character->server > -1 )
+ if( chr->server[character->server].users > 0 )
+ chr->server[character->server].users--;
+
+ character->char_id = -1;
+ character->server = -1;
+ if(character->pincode_enable == -1)
+ character->pincode_enable = pincode->charselect + pincode->enabled;
+
+ if(character->waiting_disconnect != (-1)) {
+ timer->delete(character->waiting_disconnect, chr->waiting_disconnect);
+ character->waiting_disconnect = (-1);
+ }
+
+ if (chr->login_fd > 0 && !sockt->session[chr->login_fd]->flag.eof)
+ chr->set_account_online(account_id);
+}
+
+void char_set_char_online(int map_id, int char_id, int account_id)
+{
+ struct online_char_data* character;
+ struct mmo_charstatus *cp;
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `online`='1' WHERE `char_id`='%d' LIMIT 1", char_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 234));
+
+
+ character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->ensure((chr->online_char_db),DB->i2key(account_id),(chr->create_online_char_data))) );
+ if( character->char_id != -1 && character->server > -1 && character->server != map_id )
+ {
+ (showmsg->showNotice(("chr->set_char_online: Character %d:%d marked in map server %d, but map server %d claims to have (%d:%d) online!\n"), character->account_id, character->char_id, character->server, map_id, account_id, char_id))
+ ;
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2);
+ }
+
+
+ character->char_id = char_id;
+ character->server = map_id;
+
+ if( character->server > -1 )
+ chr->server[character->server].users++;
+
+
+ if(character->waiting_disconnect != (-1)) {
+ timer->delete(character->waiting_disconnect, chr->waiting_disconnect);
+ character->waiting_disconnect = (-1);
+ }
+
+
+ cp = (struct mmo_charstatus*)( DB->data2ptr((chr->char_db_)->get((chr->char_db_),DB->i2key(char_id))) );
+ inter_guild->CharOnline(char_id, cp?cp->guild_id:-1);
+
+
+ if (chr->login_fd > 0 && !sockt->session[chr->login_fd]->flag.eof)
+ chr->set_account_online(account_id);
+}
+
+void char_set_char_offline(int char_id, int account_id)
+{
+ struct online_char_data* character;
+
+ if ( char_id == -1 )
+ {
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 274));
+ }
+ else
+ {
+ struct mmo_charstatus* cp = (struct mmo_charstatus*)( DB->data2ptr((chr->char_db_)->get((chr->char_db_),DB->i2key(char_id))) );
+ inter_guild->CharOffline(char_id, cp?cp->guild_id:-1);
+ if (cp)
+ ( (chr->char_db_)->remove((chr->char_db_),DB->i2key(char_id),
+# 281 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 281 "../../../server-code/src/char/char.c"
+ ) );
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `online`='0' WHERE `char_id`='%d' LIMIT 1", char_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 284));
+ }
+
+ if ((character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->get((chr->online_char_db),DB->i2key(account_id))) )) !=
+# 287 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 287 "../../../server-code/src/char/char.c"
+ ) {
+
+ if( character->server > -1 )
+ if( chr->server[character->server].users > 0 )
+ chr->server[character->server].users--;
+
+ if(character->waiting_disconnect != (-1)){
+ timer->delete(character->waiting_disconnect, chr->waiting_disconnect);
+ character->waiting_disconnect = (-1);
+ }
+
+ if(character->char_id == char_id)
+ {
+ character->char_id = -1;
+ character->server = -1;
+ character->pincode_enable = -1;
+ }
+
+
+ }
+
+
+ if (chr->login_fd > 0 && !sockt->session[chr->login_fd]->flag.eof && (char_id == -1 || character ==
+# 309 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 309 "../../../server-code/src/char/char.c"
+ || character->fd == -1))
+ chr->set_account_offline(account_id);
+}
+
+
+
+
+static int char_db_setoffline(union DBKey key, struct DBData *data, va_list ap)
+{
+ struct online_char_data* character = (struct online_char_data*)DB->data2ptr(data);
+ int server_id =
+# 319 "../../../server-code/src/char/char.c" 3 4
+ __builtin_va_arg(
+# 319 "../../../server-code/src/char/char.c"
+ ap
+# 319 "../../../server-code/src/char/char.c" 3 4
+ ,
+# 319 "../../../server-code/src/char/char.c"
+ int
+# 319 "../../../server-code/src/char/char.c" 3 4
+ )
+# 319 "../../../server-code/src/char/char.c"
+ ;
+ do { if (((void)(character),
+# 320 "../../../server-code/src/char/char.c" 3 4
+0
+# 320 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ if (server_id == -1) {
+ character->char_id = -1;
+ character->server = -1;
+ if(character->waiting_disconnect != (-1)){
+ timer->delete(character->waiting_disconnect, chr->waiting_disconnect);
+ character->waiting_disconnect = (-1);
+ }
+ } else if (character->server == server_id)
+ character->server = -2;
+ return 0;
+}
+
+
+
+
+static int char_db_kickoffline(union DBKey key, struct DBData *data, va_list ap)
+{
+ struct online_char_data* character = (struct online_char_data*)DB->data2ptr(data);
+ int server_id =
+# 339 "../../../server-code/src/char/char.c" 3 4
+ __builtin_va_arg(
+# 339 "../../../server-code/src/char/char.c"
+ ap
+# 339 "../../../server-code/src/char/char.c" 3 4
+ ,
+# 339 "../../../server-code/src/char/char.c"
+ int
+# 339 "../../../server-code/src/char/char.c" 3 4
+ )
+# 339 "../../../server-code/src/char/char.c"
+ ;
+ do { if (((void)(character),
+# 340 "../../../server-code/src/char/char.c" 3 4
+0
+# 340 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+
+ if (server_id > -1 && character->server != server_id)
+ return 0;
+
+
+ if (character->server > -1 && character->server < 2)
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 1);
+ else if (character->waiting_disconnect == (-1))
+ chr->set_char_offline(character->char_id, character->account_id);
+ else
+ return 0;
+
+ return 1;
+}
+
+void char_set_login_all_offline(void)
+{
+
+ WFIFOHEAD(chr->login_fd,2);
+ WFIFOW(chr->login_fd,0) = 0x2737;
+ WFIFOSET(chr->login_fd,2);
+}
+
+void char_set_all_offline(int id)
+{
+ if (id < 0)
+ (showmsg->showNotice(("Sending all users offline.\n")));
+ else
+ (showmsg->showNotice(("Sending users of map-server %d offline.\n"),id));
+ chr->online_char_db->foreach(chr->online_char_db,chr->db_kickoffline,id);
+
+ if (id >= 0 || chr->login_fd <= 0 || sockt->session[chr->login_fd]->flag.eof)
+ return;
+ chr->set_login_all_offline();
+}
+
+void char_set_all_offline_sql(void)
+{
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `online` = '0'", char_db) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 381));
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `online` = '0'", guild_member_db) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 383));
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `connect_member` = '0'", guild_db) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 385));
+}
+
+
+
+
+static struct DBData char_create_charstatus(union DBKey key, va_list args)
+{
+ struct mmo_charstatus *cp;
+ cp = (struct mmo_charstatus *) (iMalloc->calloc((1),(sizeof(struct mmo_charstatus)),"../../../server-code/src/char/char.c", 394, __func__));
+ cp->char_id = key.i;
+ return DB->ptr2data(cp);
+}
+
+int char_mmo_char_tosql(int char_id, struct mmo_charstatus* p)
+{
+ int i = 0;
+ int count = 0;
+ int diff = 0;
+ char save_status[128];
+ struct mmo_charstatus *cp;
+ int errors = 0;
+ StringBuf buf;
+
+ do { if (((void)(p),
+# 409 "../../../server-code/src/char/char.c" 3 4
+0
+# 409 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ if (char_id != p->char_id) return 0;
+
+ cp = ( DB->data2ptr((chr->char_db_)->ensure((chr->char_db_),DB->i2key(char_id),(chr->create_charstatus))) );
+
+ StrBuf->Init(&buf);
+ memset(save_status, 0, sizeof(save_status));
+
+
+ if( memcmp(p->inventory, cp->inventory, sizeof(p->inventory)) ) {
+ if (!chr->memitemdata_to_sql(p->inventory, 100, p->char_id, TABLE_INVENTORY))
+ strcat(save_status, " inventory");
+ else
+ errors++;
+ }
+
+
+ if( memcmp(p->cart, cp->cart, sizeof(p->cart)) ) {
+ if (!chr->memitemdata_to_sql(p->cart, 100, p->char_id, TABLE_CART))
+ strcat(save_status, " cart");
+ else
+ errors++;
+ }
+
+
+ if( memcmp(p->storage.items, cp->storage.items, sizeof(p->storage.items)) ) {
+ if (!chr->memitemdata_to_sql(p->storage.items, 600, p->account_id, TABLE_STORAGE))
+ strcat(save_status, " storage");
+ else
+ errors++;
+ }
+
+ if (
+ (p->base_exp != cp->base_exp) || (p->base_level != cp->base_level) ||
+ (p->job_level != cp->job_level) || (p->job_exp != cp->job_exp) ||
+ (p->zeny != cp->zeny) ||
+ (p->last_point.map != cp->last_point.map) ||
+ (p->last_point.x != cp->last_point.x) || (p->last_point.y != cp->last_point.y) ||
+ (p->max_hp != cp->max_hp) || (p->hp != cp->hp) ||
+ (p->max_sp != cp->max_sp) || (p->sp != cp->sp) ||
+ (p->status_point != cp->status_point) || (p->skill_point != cp->skill_point) ||
+ (p->str != cp->str) || (p->agi != cp->agi) || (p->vit != cp->vit) ||
+ (p->int_ != cp->int_) || (p->dex != cp->dex) || (p->luk != cp->luk) ||
+ (p->option != cp->option) ||
+ (p->party_id != cp->party_id) || (p->guild_id != cp->guild_id) ||
+ (p->pet_id != cp->pet_id) || (p->weapon != cp->weapon) || (p->hom_id != cp->hom_id) ||
+ (p->ele_id != cp->ele_id) || (p->shield != cp->shield) || (p->head_top != cp->head_top) ||
+ (p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom) || (p->delete_date != cp->delete_date) ||
+ (p->rename != cp->rename) || (p->slotchange != cp->slotchange) || (p->robe != cp->robe) ||
+ (p->show_equip != cp->show_equip) || (p->allow_party != cp->allow_party) || (p->font != cp->font) ||
+ (p->uniqueitem_counter != cp->uniqueitem_counter) || (p->hotkey_rowshift != cp->hotkey_rowshift)
+ ) {
+
+ unsigned int opt = 0;
+
+ if( p->allow_party )
+ opt |= OPT_ALLOW_PARTY;
+ if( p->show_equip )
+ opt |= OPT_SHOW_EQUIP;
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `base_level`='%u', `job_level`='%u',"
+ "`base_exp`='%u', `job_exp`='%u', `zeny`='%d',"
+ "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%u',`skill_point`='%u',"
+ "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
+ "`option`='%u',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',`homun_id`='%d',`elemental_id`='%d',"
+ "`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
+ "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d',"
+ "`delete_date`='%lu',`robe`='%d',`slotchange`='%d', `char_opt`='%u', `font`='%u', `uniqueitem_counter` ='%u',"
+ "`hotkey_rowshift`='%d'"
+ " WHERE `account_id`='%d' AND `char_id` = '%d'",
+ char_db, p->base_level, p->job_level,
+ p->base_exp, p->job_exp, p->zeny,
+ p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, p->skill_point,
+ p->str, p->agi, p->vit, p->int_, p->dex, p->luk,
+ p->option, p->party_id, p->guild_id, p->pet_id, p->hom_id, p->ele_id,
+ p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
+ mapindex->id2name((p->last_point.map),"../../../server-code/src/char/char.c", 485, __func__), p->last_point.x, p->last_point.y,
+ mapindex->id2name((p->save_point.map),"../../../server-code/src/char/char.c", 486, __func__), p->save_point.x, p->save_point.y, p->rename,
+ (unsigned long)p->delete_date,
+ p->robe,p->slotchange,opt,p->font,p->uniqueitem_counter,
+ p->hotkey_rowshift,
+ p->account_id, p->char_id) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 492));
+ errors++;
+ } else
+ strcat(save_status, " status");
+ }
+
+ if( p->bank_vault != cp->bank_vault || p->mod_exp != cp->mod_exp || p->mod_drop != cp->mod_drop || p->mod_death != cp->mod_death ) {
+ if( (-1) == SQL->Query(inter->sql_handle, "REPLACE INTO `%s` (`account_id`,`bank_vault`,`base_exp`,`base_drop`,`base_death`) VALUES ('%d','%d','%d','%d','%d')",account_data_db,p->account_id,p->bank_vault,p->mod_exp,p->mod_drop,p->mod_death) ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 500));
+ errors++;
+ } else
+ strcat(save_status, " accdata");
+ }
+
+
+ if (
+ (p->hair != cp->hair) || (p->hair_color != cp->hair_color) ||
+ (p->clothes_color != cp->clothes_color) || (p->body != cp->body) ||
+ (p->class_ != cp->class_) ||
+ (p->partner_id != cp->partner_id) || (p->father != cp->father) ||
+ (p->mother != cp->mother) || (p->child != cp->child) ||
+ (p->karma != cp->karma) || (p->manner != cp->manner) ||
+ (p->fame != cp->fame)
+ )
+ {
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `class`='%d',"
+ "`hair`='%d', `hair_color`='%d', `clothes_color`='%d', `body`='%d',"
+ "`partner_id`='%d', `father`='%d', `mother`='%d', `child`='%d',"
+ "`karma`='%d', `manner`='%d', `fame`='%d'"
+ " WHERE `account_id`='%d' AND `char_id` = '%d'",
+ char_db, p->class_,
+ p->hair, p->hair_color, p->clothes_color, p->body,
+ p->partner_id, p->father, p->mother, p->child,
+ p->karma, p->manner, p->fame,
+ p->account_id, p->char_id) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 528));
+ errors++;
+ } else
+ strcat(save_status, " status2");
+ }
+
+
+ if( (p->mer_id != cp->mer_id) ||
+ (p->arch_calls != cp->arch_calls) || (p->arch_faith != cp->arch_faith) ||
+ (p->spear_calls != cp->spear_calls) || (p->spear_faith != cp->spear_faith) ||
+ (p->sword_calls != cp->sword_calls) || (p->sword_faith != cp->sword_faith) )
+ {
+ if (inter_mercenary->owner_tosql(char_id, p))
+ strcat(save_status, " mercenary");
+ else
+ errors++;
+ }
+
+
+ if( memcmp(p->memo_point, cp->memo_point, sizeof(p->memo_point)) )
+ {
+ char esc_mapname[(23 + 1)*2+1];
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", memo_db, p->char_id) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 554));
+ errors++;
+ }
+
+
+ StrBuf->Clear(&buf);
+ StrBuf->Printf(&buf, "INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ", memo_db);
+ for( i = 0, count = 0; i < 3; ++i )
+ {
+ if( p->memo_point[i].map )
+ {
+ if( count )
+ StrBuf->AppendStr(&buf, ",");
+ SQL->EscapeString(inter->sql_handle, esc_mapname, mapindex->id2name((p->memo_point[i].map),"../../../server-code/src/char/char.c", 567, __func__));
+ StrBuf->Printf(&buf, "('%d', '%s', '%d', '%d')", char_id, esc_mapname, p->memo_point[i].x, p->memo_point[i].y);
+ ++count;
+ }
+ }
+ if( count )
+ {
+ if( (-1) == SQL->QueryStr(inter->sql_handle, StrBuf->Value(&buf)) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 576));
+ errors++;
+ }
+ }
+ strcat(save_status, " memo");
+ }
+
+
+ if( memcmp(p->skill, cp->skill, sizeof(p->skill)) ) {
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", skill_db, p->char_id) ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 587));
+ errors++;
+ }
+
+ StrBuf->Clear(&buf);
+ StrBuf->Printf(&buf, "INSERT INTO `%s`(`char_id`,`id`,`lv`,`flag`) VALUES ", skill_db);
+
+ for( i = 0, count = 0; i < 1478; ++i ) {
+ if( p->skill[i].id != 0 && p->skill[i].flag != SKILL_FLAG_TEMPORARY ) {
+ if( p->skill[i].lv == 0 && ( p->skill[i].flag == SKILL_FLAG_PERM_GRANTED || p->skill[i].flag == SKILL_FLAG_PERMANENT ) )
+ continue;
+ if( p->skill[i].flag != SKILL_FLAG_PERMANENT && p->skill[i].flag != SKILL_FLAG_PERM_GRANTED && (p->skill[i].flag - SKILL_FLAG_REPLACED_LV_0) == 0 )
+ continue;
+ if( count )
+ StrBuf->AppendStr(&buf, ",");
+ StrBuf->Printf(&buf, "('%d','%d','%d','%d')", char_id, p->skill[i].id,
+ ( (p->skill[i].flag == SKILL_FLAG_PERMANENT || p->skill[i].flag == SKILL_FLAG_PERM_GRANTED) ? p->skill[i].lv : p->skill[i].flag - SKILL_FLAG_REPLACED_LV_0),
+ p->skill[i].flag == SKILL_FLAG_PERM_GRANTED ? p->skill[i].flag : 0);
+ ++count;
+ }
+ }
+ if( count )
+ {
+ if( (-1) == SQL->QueryStr(inter->sql_handle, StrBuf->Value(&buf)) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 612));
+ errors++;
+ }
+ }
+
+ strcat(save_status, " skills");
+ }
+
+ diff = 0;
+ for(i = 0; i < 40; i++){
+ if(p->friends[i].char_id != cp->friends[i].char_id ||
+ p->friends[i].account_id != cp->friends[i].account_id){
+ diff = 1;
+ break;
+ }
+ }
+
+ if(diff == 1) {
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", friend_db, char_id) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 633));
+ errors++;
+ }
+
+ StrBuf->Clear(&buf);
+ StrBuf->Printf(&buf, "INSERT INTO `%s` (`char_id`, `friend_account`, `friend_id`) VALUES ", friend_db);
+ for( i = 0, count = 0; i < 40; ++i )
+ {
+ if( p->friends[i].char_id > 0 )
+ {
+ if( count )
+ StrBuf->AppendStr(&buf, ",");
+ StrBuf->Printf(&buf, "('%d','%d','%d')", char_id, p->friends[i].account_id, p->friends[i].char_id);
+ count++;
+ }
+ }
+ if( count )
+ {
+ if( (-1) == SQL->QueryStr(inter->sql_handle, StrBuf->Value(&buf)) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 653));
+ errors++;
+ }
+ }
+ strcat(save_status, " friends");
+ }
+
+
+
+ StrBuf->Clear(&buf);
+ StrBuf->Printf(&buf, "REPLACE INTO `%s` (`char_id`, `hotkey`, `type`, `itemskill_id`, `skill_lvl`) VALUES ", hotkey_db);
+ diff = 0;
+ for(i = 0; i < ( (int)(sizeof(p->hotkeys)/sizeof((p->hotkeys)[0])) ); i++){
+ if(memcmp(&p->hotkeys[i], &cp->hotkeys[i], sizeof(struct hotkey)))
+ {
+ if( diff )
+ StrBuf->AppendStr(&buf, ",");
+ StrBuf->Printf(&buf, "('%d','%u','%u','%u','%u')", char_id, (unsigned int)i, (unsigned int)p->hotkeys[i].type, p->hotkeys[i].id , (unsigned int)p->hotkeys[i].lv);
+ diff = 1;
+ }
+ }
+ if(diff) {
+ if( (-1) == SQL->QueryStr(inter->sql_handle, StrBuf->Value(&buf)) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 677));
+ errors++;
+ } else
+ strcat(save_status, " hotkeys");
+ }
+
+
+ StrBuf->Destroy(&buf);
+ if (save_status[0]!='\0' && save_log)
+ (showmsg->showInfo(("Saved char %d - %s:%s.\n"), char_id, p->name, save_status));
+ if (!errors)
+ memcpy(cp, p, sizeof(struct mmo_charstatus));
+ return 0;
+}
+# 702 "../../../server-code/src/char/char.c"
+int char_memitemdata_to_sql(const struct item items[], int max, int id, int tableswitch)
+{
+ StringBuf buf;
+ struct SqlStmt *stmt =
+# 705 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 705 "../../../server-code/src/char/char.c"
+ ;
+ int i, j;
+ const char *tablename =
+# 707 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 707 "../../../server-code/src/char/char.c"
+ ;
+ const char *selectoption =
+# 708 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 708 "../../../server-code/src/char/char.c"
+ ;
+
+# 709 "../../../server-code/src/char/char.c" 3 4
+_Bool
+# 709 "../../../server-code/src/char/char.c"
+ has_favorite =
+# 709 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 709 "../../../server-code/src/char/char.c"
+ ;
+ struct item item = { 0 };
+
+# 711 "../../../server-code/src/char/char.c" 3 4
+_Bool
+# 711 "../../../server-code/src/char/char.c"
+ *flag =
+# 711 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 711 "../../../server-code/src/char/char.c"
+ ;
+
+# 712 "../../../server-code/src/char/char.c" 3 4
+_Bool
+# 712 "../../../server-code/src/char/char.c"
+ found;
+ int errors = 0;
+
+ do { if (((void)(items),
+# 715 "../../../server-code/src/char/char.c" 3 4
+0
+# 715 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+
+ switch (tableswitch) {
+ case TABLE_INVENTORY: tablename = inventory_db; selectoption = "char_id"; has_favorite =
+# 718 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 718 "../../../server-code/src/char/char.c"
+ ; break;
+ case TABLE_CART: tablename = cart_db; selectoption = "char_id"; break;
+ case TABLE_STORAGE: tablename = storage_db; selectoption = "account_id"; break;
+ case TABLE_GUILD_STORAGE: tablename = guild_storage_db; selectoption = "guild_id"; break;
+ default:
+ (showmsg->showError(("Invalid table name!\n")));
+ do { if (( (tableswitch) ?
+# 724 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 724 "../../../server-code/src/char/char.c"
+ : (nullpo->assert_report("../../../server-code/src/char/char.c", 724, __func__, "tableswitch", "failed assertion"),
+# 724 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 724 "../../../server-code/src/char/char.c"
+ ) )) return(1); } while(0);
+ }
+
+
+
+
+
+
+ StrBuf->Init(&buf);
+ StrBuf->AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `bound`, `unique_id`");
+ for (j = 0; j < 4; ++j)
+ StrBuf->Printf(&buf, ", `card%d`", j);
+ if (has_favorite)
+ StrBuf->AppendStr(&buf, ", `favorite`");
+ StrBuf->Printf(&buf, " FROM `%s` WHERE `%s`='%d'", tablename, selectoption, id);
+
+ stmt = SQL->StmtMalloc(inter->sql_handle);
+ if ((-1) == SQL->StmtPrepareStr(stmt, StrBuf->Value(&buf))
+ || (-1) == SQL->StmtExecute(stmt)) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 743));
+ SQL->StmtFree(stmt);
+ StrBuf->Destroy(&buf);
+ return 1;
+ }
+
+ SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &item.id, 0,
+# 749 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 749 "../../../server-code/src/char/char.c"
+ ,
+# 749 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 749 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 1, SQLDT_SHORT, &item.nameid, 0,
+# 750 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 750 "../../../server-code/src/char/char.c"
+ ,
+# 750 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 750 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 2, SQLDT_SHORT, &item.amount, 0,
+# 751 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 751 "../../../server-code/src/char/char.c"
+ ,
+# 751 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 751 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 3, SQLDT_UINT, &item.equip, 0,
+# 752 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 752 "../../../server-code/src/char/char.c"
+ ,
+# 752 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 752 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 4, SQLDT_CHAR, &item.identify, 0,
+# 753 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 753 "../../../server-code/src/char/char.c"
+ ,
+# 753 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 753 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 5, SQLDT_CHAR, &item.refine, 0,
+# 754 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 754 "../../../server-code/src/char/char.c"
+ ,
+# 754 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 754 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 6, SQLDT_CHAR, &item.attribute, 0,
+# 755 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 755 "../../../server-code/src/char/char.c"
+ ,
+# 755 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 755 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 7, SQLDT_UINT, &item.expire_time, 0,
+# 756 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 756 "../../../server-code/src/char/char.c"
+ ,
+# 756 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 756 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 8, SQLDT_UCHAR, &item.bound, 0,
+# 757 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 757 "../../../server-code/src/char/char.c"
+ ,
+# 757 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 757 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 9, SQLDT_UINT64, &item.unique_id, 0,
+# 758 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 758 "../../../server-code/src/char/char.c"
+ ,
+# 758 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 758 "../../../server-code/src/char/char.c"
+ );
+ for (j = 0; j < 4; ++j)
+ SQL->StmtBindColumn(stmt, 10+j, SQLDT_SHORT, &item.card[j], 0,
+# 760 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 760 "../../../server-code/src/char/char.c"
+ ,
+# 760 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 760 "../../../server-code/src/char/char.c"
+ );
+ if (has_favorite)
+ SQL->StmtBindColumn(stmt, 10+4, SQLDT_UCHAR, &item.favorite, 0,
+# 762 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 762 "../../../server-code/src/char/char.c"
+ ,
+# 762 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 762 "../../../server-code/src/char/char.c"
+ );
+
+
+ flag = (iMalloc->calloc((max),(sizeof(
+# 765 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 765 "../../../server-code/src/char/char.c"
+ )),"../../../server-code/src/char/char.c", 765, __func__));
+
+ while (0 == SQL->StmtNextRow(stmt)) {
+ found =
+# 768 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 768 "../../../server-code/src/char/char.c"
+ ;
+
+ for (i = 0; i < max; ++i) {
+
+ if (items[i].nameid == 0 || flag[i])
+ continue;
+
+ if (items[i].nameid == item.nameid
+ && items[i].unique_id == item.unique_id
+ && items[i].card[0] == item.card[0]
+ && items[i].card[2] == item.card[2]
+ && items[i].card[3] == item.card[3]
+ ) {
+
+ do { for ((j) = (0); (j) < (4); ++(j)) if (items[i].card[j] != item.card[j]) break; } while(
+# 782 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 782 "../../../server-code/src/char/char.c"
+ );
+ if (j == 4
+ && items[i].amount == item.amount
+ && items[i].equip == item.equip
+ && items[i].identify == item.identify
+ && items[i].refine == item.refine
+ && items[i].attribute == item.attribute
+ && items[i].expire_time == item.expire_time
+ && items[i].bound == item.bound
+ && (!has_favorite || items[i].favorite == item.favorite)
+ ) {
+ ;
+ } else {
+
+ StrBuf->Clear(&buf);
+ StrBuf->Printf(&buf, "UPDATE `%s` SET `amount`='%d', `equip`='%u', `identify`='%d', `refine`='%d',`attribute`='%d', `expire_time`='%u', `bound`='%d'",
+ tablename, items[i].amount, items[i].equip, items[i].identify, items[i].refine, items[i].attribute, items[i].expire_time, items[i].bound);
+ for (j = 0; j < 4; ++j)
+ StrBuf->Printf(&buf, ", `card%d`=%d", j, items[i].card[j]);
+ if (has_favorite)
+ StrBuf->Printf(&buf, ", `favorite`='%d'", items[i].favorite);
+ StrBuf->Printf(&buf, " WHERE `id`='%d' LIMIT 1", item.id);
+
+ if ((-1) == SQL->QueryStr(inter->sql_handle, StrBuf->Value(&buf))) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 806));
+ errors++;
+ }
+ }
+
+ found = flag[i] =
+# 811 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 811 "../../../server-code/src/char/char.c"
+ ;
+ break;
+ }
+ }
+ if (!found) {
+
+ if ((-1) == SQL->Query(inter->sql_handle, "DELETE from `%s` where `id`='%d' LIMIT 1", tablename, item.id)) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 818));
+ errors++;
+ }
+ }
+ }
+ SQL->StmtFree(stmt);
+
+ StrBuf->Clear(&buf);
+ StrBuf->Printf(&buf, "INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `bound`, `unique_id`", tablename, selectoption);
+ for (j = 0; j < 4; ++j)
+ StrBuf->Printf(&buf, ", `card%d`", j);
+ if (has_favorite)
+ StrBuf->AppendStr(&buf, ", `favorite`");
+ StrBuf->AppendStr(&buf, ") VALUES ");
+
+ found =
+# 833 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 833 "../../../server-code/src/char/char.c"
+ ;
+
+ for (i = 0; i < max; ++i) {
+
+ if (items[i].nameid == 0 || flag[i])
+ continue;
+
+ if (found)
+ StrBuf->AppendStr(&buf, ",");
+ else
+ found =
+# 843 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 843 "../../../server-code/src/char/char.c"
+ ;
+
+ StrBuf->Printf(&buf, "('%d', '%d', '%d', '%u', '%d', '%d', '%d', '%u', '%d', '%"
+# 845 "../../../server-code/src/char/char.c" 3 4
+ "l" "u"
+# 845 "../../../server-code/src/char/char.c"
+ "'",
+ id, items[i].nameid, items[i].amount, items[i].equip, items[i].identify, items[i].refine, items[i].attribute, items[i].expire_time, items[i].bound, items[i].unique_id);
+ for (j = 0; j < 4; ++j)
+ StrBuf->Printf(&buf, ", '%d'", items[i].card[j]);
+ if (has_favorite)
+ StrBuf->Printf(&buf, ", '%d'", items[i].favorite);
+ StrBuf->AppendStr(&buf, ")");
+ }
+
+ if (found && (-1) == SQL->QueryStr(inter->sql_handle, StrBuf->Value(&buf))) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 855));
+ errors++;
+ }
+
+ StrBuf->Destroy(&buf);
+ (iMalloc->free((flag),"../../../server-code/src/char/char.c", 860, __func__));
+
+ return errors;
+}
+# 878 "../../../server-code/src/char/char.c"
+int char_mmo_gender(const struct char_session_data *sd, const struct mmo_charstatus *p, char sex)
+{
+# 892 "../../../server-code/src/char/char.c"
+ if (sex == 'M' || sex == 'F') {
+ if (!sd) {
+
+ (showmsg->showWarning(("Character '%s' (CID: %d, AID: %d) has sex '%c', but PACKETVER does not support per-character sex. Defaulting to 'U'.\n"), p->name, p->char_id, p->account_id, sex))
+ ;
+ return 99;
+ }
+ if ((sex == 'M' && sd->sex == SEX_FEMALE)
+ || (sex == 'F' && sd->sex == SEX_MALE)) {
+ (showmsg->showWarning(("Changing sex of character '%s' (CID: %d, AID: %d) to 'U' due to incompatible PACKETVER.\n"), p->name, p->char_id, p->account_id));
+ chr->changecharsex(p->char_id, sd->sex);
+ } else {
+ (showmsg->showInfo(("Resetting sex of character '%s' (CID: %d, AID: %d) to 'U' due to incompatible PACKETVER.\n"), p->name, p->char_id, p->account_id));
+ }
+ if ((-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `sex` = 'U' WHERE `char_id` = '%d'", char_db, p->char_id)) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 907));
+ }
+ }
+ return 99;
+
+}
+
+
+
+int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf)
+{
+ struct SqlStmt *stmt;
+ struct mmo_charstatus p;
+ int j = 0, i;
+ char last_map[((11 + 1) + 4)];
+ time_t unban_time = 0;
+ char sex[2];
+
+ do { if (((void)(sd),
+# 925 "../../../server-code/src/char/char.c" 3 4
+0
+# 925 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ do { if (((void)(buf),
+# 926 "../../../server-code/src/char/char.c" 3 4
+0
+# 926 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+
+ stmt = SQL->StmtMalloc(inter->sql_handle);
+ if( stmt ==
+# 929 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 929 "../../../server-code/src/char/char.c"
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 930));
+ return 0;
+ }
+ memset(&p, 0, sizeof(p));
+
+ for(i = 0 ; i < 9; i++ ) {
+ sd->found_char[i] = -1;
+ sd->unban_time[i] = 0;
+ }
+
+
+ if ((-1) == SQL->StmtPrepare(stmt, "SELECT "
+ "`char_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
+ "`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,"
+ "`status_point`,`skill_point`,`option`,`karma`,`manner`,`hair`,`hair_color`,"
+ "`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`rename`,`delete_date`,"
+ "`robe`,`slotchange`,`unban_time`,`sex`"
+ " FROM `%s` WHERE `account_id`='%d' AND `char_num` < '%d'", char_db, sd->account_id, 9)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &p.char_id, 0,
+# 949 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 949 "../../../server-code/src/char/char.c"
+ ,
+# 949 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 949 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_UCHAR, &p.slot, 0,
+# 950 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 950 "../../../server-code/src/char/char.c"
+ ,
+# 950 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 950 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_STRING, &p.name, sizeof(p.name),
+# 951 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 951 "../../../server-code/src/char/char.c"
+ ,
+# 951 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 951 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 3, SQLDT_SHORT, &p.class_, 0,
+# 952 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 952 "../../../server-code/src/char/char.c"
+ ,
+# 952 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 952 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 4, SQLDT_UINT, &p.base_level, 0,
+# 953 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 953 "../../../server-code/src/char/char.c"
+ ,
+# 953 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 953 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 5, SQLDT_UINT, &p.job_level, 0,
+# 954 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 954 "../../../server-code/src/char/char.c"
+ ,
+# 954 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 954 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 6, SQLDT_UINT, &p.base_exp, 0,
+# 955 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 955 "../../../server-code/src/char/char.c"
+ ,
+# 955 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 955 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 7, SQLDT_UINT, &p.job_exp, 0,
+# 956 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 956 "../../../server-code/src/char/char.c"
+ ,
+# 956 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 956 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 8, SQLDT_INT, &p.zeny, 0,
+# 957 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 957 "../../../server-code/src/char/char.c"
+ ,
+# 957 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 957 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 9, SQLDT_SHORT, &p.str, 0,
+# 958 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 958 "../../../server-code/src/char/char.c"
+ ,
+# 958 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 958 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 10, SQLDT_SHORT, &p.agi, 0,
+# 959 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 959 "../../../server-code/src/char/char.c"
+ ,
+# 959 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 959 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 11, SQLDT_SHORT, &p.vit, 0,
+# 960 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 960 "../../../server-code/src/char/char.c"
+ ,
+# 960 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 960 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 12, SQLDT_SHORT, &p.int_, 0,
+# 961 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 961 "../../../server-code/src/char/char.c"
+ ,
+# 961 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 961 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 13, SQLDT_SHORT, &p.dex, 0,
+# 962 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 962 "../../../server-code/src/char/char.c"
+ ,
+# 962 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 962 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 14, SQLDT_SHORT, &p.luk, 0,
+# 963 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 963 "../../../server-code/src/char/char.c"
+ ,
+# 963 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 963 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 15, SQLDT_INT, &p.max_hp, 0,
+# 964 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 964 "../../../server-code/src/char/char.c"
+ ,
+# 964 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 964 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 16, SQLDT_INT, &p.hp, 0,
+# 965 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 965 "../../../server-code/src/char/char.c"
+ ,
+# 965 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 965 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 17, SQLDT_INT, &p.max_sp, 0,
+# 966 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 966 "../../../server-code/src/char/char.c"
+ ,
+# 966 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 966 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 18, SQLDT_INT, &p.sp, 0,
+# 967 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 967 "../../../server-code/src/char/char.c"
+ ,
+# 967 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 967 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 19, SQLDT_UINT, &p.status_point, 0,
+# 968 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 968 "../../../server-code/src/char/char.c"
+ ,
+# 968 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 968 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 20, SQLDT_UINT, &p.skill_point, 0,
+# 969 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 969 "../../../server-code/src/char/char.c"
+ ,
+# 969 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 969 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 21, SQLDT_UINT, &p.option, 0,
+# 970 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 970 "../../../server-code/src/char/char.c"
+ ,
+# 970 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 970 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 22, SQLDT_UCHAR, &p.karma, 0,
+# 971 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 971 "../../../server-code/src/char/char.c"
+ ,
+# 971 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 971 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 23, SQLDT_SHORT, &p.manner, 0,
+# 972 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 972 "../../../server-code/src/char/char.c"
+ ,
+# 972 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 972 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 24, SQLDT_SHORT, &p.hair, 0,
+# 973 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 973 "../../../server-code/src/char/char.c"
+ ,
+# 973 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 973 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 25, SQLDT_SHORT, &p.hair_color, 0,
+# 974 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 974 "../../../server-code/src/char/char.c"
+ ,
+# 974 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 974 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 26, SQLDT_SHORT, &p.clothes_color, 0,
+# 975 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 975 "../../../server-code/src/char/char.c"
+ ,
+# 975 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 975 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 27, SQLDT_SHORT, &p.body, 0,
+# 976 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 976 "../../../server-code/src/char/char.c"
+ ,
+# 976 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 976 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 28, SQLDT_SHORT, &p.weapon, 0,
+# 977 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 977 "../../../server-code/src/char/char.c"
+ ,
+# 977 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 977 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 29, SQLDT_SHORT, &p.shield, 0,
+# 978 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 978 "../../../server-code/src/char/char.c"
+ ,
+# 978 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 978 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 30, SQLDT_SHORT, &p.head_top, 0,
+# 979 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 979 "../../../server-code/src/char/char.c"
+ ,
+# 979 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 979 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 31, SQLDT_SHORT, &p.head_mid, 0,
+# 980 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 980 "../../../server-code/src/char/char.c"
+ ,
+# 980 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 980 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 32, SQLDT_SHORT, &p.head_bottom, 0,
+# 981 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 981 "../../../server-code/src/char/char.c"
+ ,
+# 981 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 981 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 33, SQLDT_STRING, &last_map, sizeof(last_map),
+# 982 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 982 "../../../server-code/src/char/char.c"
+ ,
+# 982 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 982 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 34, SQLDT_USHORT, &p.rename, 0,
+# 983 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 983 "../../../server-code/src/char/char.c"
+ ,
+# 983 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 983 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 35, SQLDT_UINT32, &p.delete_date, 0,
+# 984 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 984 "../../../server-code/src/char/char.c"
+ ,
+# 984 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 984 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 36, SQLDT_SHORT, &p.robe, 0,
+# 985 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 985 "../../../server-code/src/char/char.c"
+ ,
+# 985 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 985 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 37, SQLDT_USHORT, &p.slotchange, 0,
+# 986 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 986 "../../../server-code/src/char/char.c"
+ ,
+# 986 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 986 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 38, SQLDT_LONG, &unban_time, 0,
+# 987 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 987 "../../../server-code/src/char/char.c"
+ ,
+# 987 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 987 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 39, SQLDT_ENUM, &sex, sizeof(sex),
+# 988 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 988 "../../../server-code/src/char/char.c"
+ ,
+# 988 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 988 "../../../server-code/src/char/char.c"
+ )
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 990));
+ SQL->StmtFree(stmt);
+ return 0;
+ }
+
+ for( i = 0; i < 9 && 0 == SQL->StmtNextRow(stmt); i++ ) {
+ if (p.slot >= 9)
+ continue;
+ p.last_point.map = mapindex->name2id(last_map);
+ sd->found_char[p.slot] = p.char_id;
+ sd->unban_time[p.slot] = unban_time;
+ p.sex = chr->mmo_gender(sd, &p, sex[0]);
+ j += chr->mmo_char_tobuf(WBUFP(buf, j), &p);
+ }
+
+ memset(sd->new_name,0,sizeof(sd->new_name));
+
+ SQL->StmtFree(stmt);
+ return j;
+}
+
+
+int char_mmo_char_fromsql(int char_id, struct mmo_charstatus* p,
+# 1012 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 1012 "../../../server-code/src/char/char.c"
+ load_everything)
+{
+ int i,j;
+ char t_msg[128] = "";
+ struct mmo_charstatus* cp;
+ StringBuf buf;
+ struct SqlStmt *stmt;
+ char last_map[((11 + 1) + 4)];
+ char save_map[((11 + 1) + 4)];
+ char point_map[((11 + 1) + 4)];
+ struct point tmp_point;
+ struct item tmp_item;
+ struct s_skill tmp_skill;
+ struct s_friend tmp_friend;
+
+ struct hotkey tmp_hotkey;
+ int hotkey_num = 0;
+
+ unsigned int opt;
+ int account_id;
+ char sex[2];
+
+ do { if (((void)(p),
+# 1034 "../../../server-code/src/char/char.c" 3 4
+0
+# 1034 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+
+ memset(p, 0, sizeof(struct mmo_charstatus));
+
+ if (save_log) (showmsg->showInfo(("Char load request (%d)\n"), char_id));
+
+ stmt = SQL->StmtMalloc(inter->sql_handle);
+ if( stmt ==
+# 1041 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1041 "../../../server-code/src/char/char.c"
+ )
+ {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1043));
+ return 0;
+ }
+
+
+ if ((-1) == SQL->StmtPrepare(stmt, "SELECT "
+ "`char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
+ "`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,"
+ "`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`,"
+ "`hair_color`,`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`,"
+ "`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`,`slotchange`,"
+ "`char_opt`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`"
+ " FROM `%s` WHERE `char_id`=? LIMIT 1", char_db)
+ || (-1) == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &p->char_id, 0,
+# 1058 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1058 "../../../server-code/src/char/char.c"
+ ,
+# 1058 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1058 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &p->account_id, 0,
+# 1059 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1059 "../../../server-code/src/char/char.c"
+ ,
+# 1059 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1059 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_UCHAR, &p->slot, 0,
+# 1060 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1060 "../../../server-code/src/char/char.c"
+ ,
+# 1060 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1060 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 3, SQLDT_STRING, &p->name, sizeof(p->name),
+# 1061 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1061 "../../../server-code/src/char/char.c"
+ ,
+# 1061 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1061 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 4, SQLDT_SHORT, &p->class_, 0,
+# 1062 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1062 "../../../server-code/src/char/char.c"
+ ,
+# 1062 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1062 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 5, SQLDT_UINT, &p->base_level, 0,
+# 1063 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1063 "../../../server-code/src/char/char.c"
+ ,
+# 1063 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1063 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 6, SQLDT_UINT, &p->job_level, 0,
+# 1064 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1064 "../../../server-code/src/char/char.c"
+ ,
+# 1064 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1064 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 7, SQLDT_UINT, &p->base_exp, 0,
+# 1065 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1065 "../../../server-code/src/char/char.c"
+ ,
+# 1065 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1065 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 8, SQLDT_UINT, &p->job_exp, 0,
+# 1066 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1066 "../../../server-code/src/char/char.c"
+ ,
+# 1066 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1066 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 9, SQLDT_INT, &p->zeny, 0,
+# 1067 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1067 "../../../server-code/src/char/char.c"
+ ,
+# 1067 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1067 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 10, SQLDT_SHORT, &p->str, 0,
+# 1068 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1068 "../../../server-code/src/char/char.c"
+ ,
+# 1068 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1068 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 11, SQLDT_SHORT, &p->agi, 0,
+# 1069 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1069 "../../../server-code/src/char/char.c"
+ ,
+# 1069 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1069 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 12, SQLDT_SHORT, &p->vit, 0,
+# 1070 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1070 "../../../server-code/src/char/char.c"
+ ,
+# 1070 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1070 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 13, SQLDT_SHORT, &p->int_, 0,
+# 1071 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1071 "../../../server-code/src/char/char.c"
+ ,
+# 1071 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1071 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 14, SQLDT_SHORT, &p->dex, 0,
+# 1072 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1072 "../../../server-code/src/char/char.c"
+ ,
+# 1072 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1072 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 15, SQLDT_SHORT, &p->luk, 0,
+# 1073 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1073 "../../../server-code/src/char/char.c"
+ ,
+# 1073 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1073 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 16, SQLDT_INT, &p->max_hp, 0,
+# 1074 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1074 "../../../server-code/src/char/char.c"
+ ,
+# 1074 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1074 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 17, SQLDT_INT, &p->hp, 0,
+# 1075 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1075 "../../../server-code/src/char/char.c"
+ ,
+# 1075 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1075 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 18, SQLDT_INT, &p->max_sp, 0,
+# 1076 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1076 "../../../server-code/src/char/char.c"
+ ,
+# 1076 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1076 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 19, SQLDT_INT, &p->sp, 0,
+# 1077 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1077 "../../../server-code/src/char/char.c"
+ ,
+# 1077 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1077 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 20, SQLDT_UINT, &p->status_point, 0,
+# 1078 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1078 "../../../server-code/src/char/char.c"
+ ,
+# 1078 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1078 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 21, SQLDT_UINT, &p->skill_point, 0,
+# 1079 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1079 "../../../server-code/src/char/char.c"
+ ,
+# 1079 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1079 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 22, SQLDT_UINT, &p->option, 0,
+# 1080 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1080 "../../../server-code/src/char/char.c"
+ ,
+# 1080 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1080 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 23, SQLDT_UCHAR, &p->karma, 0,
+# 1081 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1081 "../../../server-code/src/char/char.c"
+ ,
+# 1081 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1081 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 24, SQLDT_SHORT, &p->manner, 0,
+# 1082 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1082 "../../../server-code/src/char/char.c"
+ ,
+# 1082 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1082 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 25, SQLDT_INT, &p->party_id, 0,
+# 1083 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1083 "../../../server-code/src/char/char.c"
+ ,
+# 1083 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1083 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 26, SQLDT_INT, &p->guild_id, 0,
+# 1084 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1084 "../../../server-code/src/char/char.c"
+ ,
+# 1084 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1084 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 27, SQLDT_INT, &p->pet_id, 0,
+# 1085 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1085 "../../../server-code/src/char/char.c"
+ ,
+# 1085 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1085 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 28, SQLDT_INT, &p->hom_id, 0,
+# 1086 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1086 "../../../server-code/src/char/char.c"
+ ,
+# 1086 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1086 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 29, SQLDT_INT, &p->ele_id, 0,
+# 1087 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1087 "../../../server-code/src/char/char.c"
+ ,
+# 1087 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1087 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 30, SQLDT_SHORT, &p->hair, 0,
+# 1088 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1088 "../../../server-code/src/char/char.c"
+ ,
+# 1088 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1088 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 31, SQLDT_SHORT, &p->hair_color, 0,
+# 1089 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1089 "../../../server-code/src/char/char.c"
+ ,
+# 1089 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1089 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 32, SQLDT_SHORT, &p->clothes_color, 0,
+# 1090 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1090 "../../../server-code/src/char/char.c"
+ ,
+# 1090 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1090 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 33, SQLDT_SHORT, &p->body, 0,
+# 1091 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1091 "../../../server-code/src/char/char.c"
+ ,
+# 1091 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1091 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 34, SQLDT_SHORT, &p->weapon, 0,
+# 1092 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1092 "../../../server-code/src/char/char.c"
+ ,
+# 1092 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1092 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 35, SQLDT_SHORT, &p->shield, 0,
+# 1093 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1093 "../../../server-code/src/char/char.c"
+ ,
+# 1093 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1093 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 36, SQLDT_SHORT, &p->head_top, 0,
+# 1094 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1094 "../../../server-code/src/char/char.c"
+ ,
+# 1094 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1094 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 37, SQLDT_SHORT, &p->head_mid, 0,
+# 1095 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1095 "../../../server-code/src/char/char.c"
+ ,
+# 1095 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1095 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 38, SQLDT_SHORT, &p->head_bottom, 0,
+# 1096 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1096 "../../../server-code/src/char/char.c"
+ ,
+# 1096 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1096 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 39, SQLDT_STRING, &last_map, sizeof(last_map),
+# 1097 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1097 "../../../server-code/src/char/char.c"
+ ,
+# 1097 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1097 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 40, SQLDT_SHORT, &p->last_point.x, 0,
+# 1098 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1098 "../../../server-code/src/char/char.c"
+ ,
+# 1098 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1098 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 41, SQLDT_SHORT, &p->last_point.y, 0,
+# 1099 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1099 "../../../server-code/src/char/char.c"
+ ,
+# 1099 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1099 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 42, SQLDT_STRING, &save_map, sizeof(save_map),
+# 1100 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1100 "../../../server-code/src/char/char.c"
+ ,
+# 1100 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1100 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 43, SQLDT_SHORT, &p->save_point.x, 0,
+# 1101 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1101 "../../../server-code/src/char/char.c"
+ ,
+# 1101 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1101 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 44, SQLDT_SHORT, &p->save_point.y, 0,
+# 1102 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1102 "../../../server-code/src/char/char.c"
+ ,
+# 1102 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1102 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 45, SQLDT_INT, &p->partner_id, 0,
+# 1103 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1103 "../../../server-code/src/char/char.c"
+ ,
+# 1103 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1103 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 46, SQLDT_INT, &p->father, 0,
+# 1104 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1104 "../../../server-code/src/char/char.c"
+ ,
+# 1104 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1104 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 47, SQLDT_INT, &p->mother, 0,
+# 1105 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1105 "../../../server-code/src/char/char.c"
+ ,
+# 1105 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1105 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 48, SQLDT_INT, &p->child, 0,
+# 1106 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1106 "../../../server-code/src/char/char.c"
+ ,
+# 1106 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1106 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 49, SQLDT_INT, &p->fame, 0,
+# 1107 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1107 "../../../server-code/src/char/char.c"
+ ,
+# 1107 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1107 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 50, SQLDT_USHORT, &p->rename, 0,
+# 1108 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1108 "../../../server-code/src/char/char.c"
+ ,
+# 1108 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1108 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 51, SQLDT_UINT32, &p->delete_date, 0,
+# 1109 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1109 "../../../server-code/src/char/char.c"
+ ,
+# 1109 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1109 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 52, SQLDT_SHORT, &p->robe, 0,
+# 1110 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1110 "../../../server-code/src/char/char.c"
+ ,
+# 1110 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1110 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 53, SQLDT_USHORT, &p->slotchange, 0,
+# 1111 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1111 "../../../server-code/src/char/char.c"
+ ,
+# 1111 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1111 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 54, SQLDT_UINT, &opt, 0,
+# 1112 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1112 "../../../server-code/src/char/char.c"
+ ,
+# 1112 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1112 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 55, SQLDT_UCHAR, &p->font, 0,
+# 1113 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1113 "../../../server-code/src/char/char.c"
+ ,
+# 1113 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1113 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 56, SQLDT_UINT, &p->uniqueitem_counter, 0,
+# 1114 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1114 "../../../server-code/src/char/char.c"
+ ,
+# 1114 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1114 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 57, SQLDT_ENUM, &sex, sizeof(sex),
+# 1115 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1115 "../../../server-code/src/char/char.c"
+ ,
+# 1115 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1115 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 58, SQLDT_UCHAR, &p->hotkey_rowshift, 0,
+# 1116 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1116 "../../../server-code/src/char/char.c"
+ ,
+# 1116 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1116 "../../../server-code/src/char/char.c"
+ )
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1118));
+ SQL->StmtFree(stmt);
+ return 0;
+ }
+ if (0 != SQL->StmtNextRow(stmt))
+ {
+ (showmsg->showError(("Requested non-existant character id: %d!\n"), char_id));
+ SQL->StmtFree(stmt);
+ return 0;
+ }
+
+ p->sex = chr->mmo_gender(
+# 1129 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1129 "../../../server-code/src/char/char.c"
+ , p, sex[0]);
+
+ account_id = p->account_id;
+
+ p->last_point.map = mapindex->name2id(last_map);
+ p->save_point.map = mapindex->name2id(save_map);
+
+ if( p->last_point.map == 0 ) {
+ p->last_point.map = (unsigned short)( DB->data2i((mapindex->db)->get((mapindex->db),DB->str2key(mapindex->default_map))) );
+ p->last_point.x = mapindex->default_x;
+ p->last_point.y = mapindex->default_y;
+ }
+
+ if( p->save_point.map == 0 ) {
+ p->save_point.map = (unsigned short)( DB->data2i((mapindex->db)->get((mapindex->db),DB->str2key(mapindex->default_map))) );
+ p->save_point.x = mapindex->default_x;
+ p->save_point.y = mapindex->default_y;
+ }
+
+ strcat(t_msg, " status");
+
+ if (!load_everything)
+ {
+ SQL->StmtFree(stmt);
+ return 1;
+ }
+
+
+
+ memset(&tmp_point, 0, sizeof(tmp_point));
+ if ((-1) == SQL->StmtPrepare(stmt, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`=? ORDER by `memo_id` LIMIT %d", memo_db, 3)
+ || (-1) == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_STRING, &point_map, sizeof(point_map),
+# 1162 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1162 "../../../server-code/src/char/char.c"
+ ,
+# 1162 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1162 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_SHORT, &tmp_point.x, 0,
+# 1163 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1163 "../../../server-code/src/char/char.c"
+ ,
+# 1163 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1163 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_SHORT, &tmp_point.y, 0,
+# 1164 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1164 "../../../server-code/src/char/char.c"
+ ,
+# 1164 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1164 "../../../server-code/src/char/char.c"
+ )
+ )
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1166));
+
+ for( i = 0; i < 3 && 0 == SQL->StmtNextRow(stmt); ++i ) {
+ tmp_point.map = mapindex->name2id(point_map);
+ memcpy(&p->memo_point[i], &tmp_point, sizeof(tmp_point));
+ }
+ strcat(t_msg, " memo");
+
+
+
+ StrBuf->Init(&buf);
+ StrBuf->AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `favorite`, `bound`, `unique_id`");
+ for( i = 0; i < 4; ++i )
+ StrBuf->Printf(&buf, ", `card%d`", i);
+ StrBuf->Printf(&buf, " FROM `%s` WHERE `char_id`=? LIMIT %d", inventory_db, 100);
+
+ memset(&tmp_item, 0, sizeof(tmp_item));
+ if ((-1) == SQL->StmtPrepareStr(stmt, StrBuf->Value(&buf))
+ || (-1) == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &tmp_item.id, 0,
+# 1186 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1186 "../../../server-code/src/char/char.c"
+ ,
+# 1186 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1186 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_SHORT, &tmp_item.nameid, 0,
+# 1187 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1187 "../../../server-code/src/char/char.c"
+ ,
+# 1187 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1187 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_SHORT, &tmp_item.amount, 0,
+# 1188 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1188 "../../../server-code/src/char/char.c"
+ ,
+# 1188 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1188 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 3, SQLDT_UINT, &tmp_item.equip, 0,
+# 1189 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1189 "../../../server-code/src/char/char.c"
+ ,
+# 1189 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1189 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 4, SQLDT_CHAR, &tmp_item.identify, 0,
+# 1190 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1190 "../../../server-code/src/char/char.c"
+ ,
+# 1190 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1190 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 5, SQLDT_CHAR, &tmp_item.refine, 0,
+# 1191 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1191 "../../../server-code/src/char/char.c"
+ ,
+# 1191 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1191 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 6, SQLDT_CHAR, &tmp_item.attribute, 0,
+# 1192 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1192 "../../../server-code/src/char/char.c"
+ ,
+# 1192 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1192 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 7, SQLDT_UINT, &tmp_item.expire_time, 0,
+# 1193 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1193 "../../../server-code/src/char/char.c"
+ ,
+# 1193 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1193 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 8, SQLDT_CHAR, &tmp_item.favorite, 0,
+# 1194 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1194 "../../../server-code/src/char/char.c"
+ ,
+# 1194 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1194 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 9, SQLDT_UCHAR, &tmp_item.bound, 0,
+# 1195 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1195 "../../../server-code/src/char/char.c"
+ ,
+# 1195 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1195 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 10, SQLDT_UINT64, &tmp_item.unique_id, 0,
+# 1196 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1196 "../../../server-code/src/char/char.c"
+ ,
+# 1196 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1196 "../../../server-code/src/char/char.c"
+ )
+ )
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1198));
+ for( i = 0; i < 4; ++i )
+ if( (-1) == SQL->StmtBindColumn(stmt, 11+i, SQLDT_SHORT, &tmp_item.card[i], 0,
+# 1200 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1200 "../../../server-code/src/char/char.c"
+ ,
+# 1200 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1200 "../../../server-code/src/char/char.c"
+ ) )
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1201));
+
+ for( i = 0; i < 100 && 0 == SQL->StmtNextRow(stmt); ++i )
+ memcpy(&p->inventory[i], &tmp_item, sizeof(tmp_item));
+
+ strcat(t_msg, " inventory");
+
+
+
+ StrBuf->Clear(&buf);
+ StrBuf->AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `expire_time`, `bound`, `unique_id`");
+ for( j = 0; j < 4; ++j )
+ StrBuf->Printf(&buf, ", `card%d`", j);
+ StrBuf->Printf(&buf, " FROM `%s` WHERE `char_id`=? LIMIT %d", cart_db, 100);
+
+ memset(&tmp_item, 0, sizeof(tmp_item));
+ if ((-1) == SQL->StmtPrepareStr(stmt, StrBuf->Value(&buf))
+ || (-1) == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &tmp_item.id, 0,
+# 1220 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1220 "../../../server-code/src/char/char.c"
+ ,
+# 1220 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1220 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_SHORT, &tmp_item.nameid, 0,
+# 1221 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1221 "../../../server-code/src/char/char.c"
+ ,
+# 1221 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1221 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_SHORT, &tmp_item.amount, 0,
+# 1222 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1222 "../../../server-code/src/char/char.c"
+ ,
+# 1222 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1222 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 3, SQLDT_UINT, &tmp_item.equip, 0,
+# 1223 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1223 "../../../server-code/src/char/char.c"
+ ,
+# 1223 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1223 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 4, SQLDT_CHAR, &tmp_item.identify, 0,
+# 1224 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1224 "../../../server-code/src/char/char.c"
+ ,
+# 1224 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1224 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 5, SQLDT_CHAR, &tmp_item.refine, 0,
+# 1225 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1225 "../../../server-code/src/char/char.c"
+ ,
+# 1225 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1225 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 6, SQLDT_CHAR, &tmp_item.attribute, 0,
+# 1226 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1226 "../../../server-code/src/char/char.c"
+ ,
+# 1226 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1226 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 7, SQLDT_UINT, &tmp_item.expire_time, 0,
+# 1227 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1227 "../../../server-code/src/char/char.c"
+ ,
+# 1227 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1227 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 8, SQLDT_UCHAR, &tmp_item.bound, 0,
+# 1228 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1228 "../../../server-code/src/char/char.c"
+ ,
+# 1228 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1228 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 9, SQLDT_UINT64, &tmp_item.unique_id, 0,
+# 1229 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1229 "../../../server-code/src/char/char.c"
+ ,
+# 1229 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1229 "../../../server-code/src/char/char.c"
+ )
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1231));
+ }
+ for( i = 0; i < 4; ++i )
+ if( (-1) == SQL->StmtBindColumn(stmt, 10+i, SQLDT_SHORT, &tmp_item.card[i], 0,
+# 1234 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1234 "../../../server-code/src/char/char.c"
+ ,
+# 1234 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1234 "../../../server-code/src/char/char.c"
+ ) )
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1235));
+
+ for( i = 0; i < 100 && 0 == SQL->StmtNextRow(stmt); ++i )
+ memcpy(&p->cart[i], &tmp_item, sizeof(tmp_item));
+ strcat(t_msg, " cart");
+
+
+ inter_storage->fromsql(p->account_id, &p->storage);
+ strcat(t_msg, " storage");
+
+
+
+ memset(&tmp_skill, 0, sizeof(tmp_skill));
+ if ((-1) == SQL->StmtPrepare(stmt, "SELECT `id`, `lv`,`flag` FROM `%s` WHERE `char_id`=? LIMIT %d", skill_db, 1478)
+ || (-1) == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_USHORT, &tmp_skill.id , 0,
+# 1251 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1251 "../../../server-code/src/char/char.c"
+ ,
+# 1251 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1251 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_UCHAR , &tmp_skill.lv , 0,
+# 1252 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1252 "../../../server-code/src/char/char.c"
+ ,
+# 1252 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1252 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_UCHAR , &tmp_skill.flag, 0,
+# 1253 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1253 "../../../server-code/src/char/char.c"
+ ,
+# 1253 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1253 "../../../server-code/src/char/char.c"
+ )
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1255));
+ }
+
+ if( tmp_skill.flag != SKILL_FLAG_PERM_GRANTED )
+ tmp_skill.flag = SKILL_FLAG_PERMANENT;
+
+ for( i = 0; i < 1478 && 0 == SQL->StmtNextRow(stmt); ++i ) {
+ if( skillid2idx[tmp_skill.id] )
+ memcpy(&p->skill[skillid2idx[tmp_skill.id]], &tmp_skill, sizeof(tmp_skill));
+ else
+ (showmsg->showWarning(("chr->mmo_char_fromsql: ignoring invalid skill (id=%u,lv=%u) of character %s (AID=%d,CID=%d)\n"), tmp_skill.id, tmp_skill.lv, p->name, p->account_id, p->char_id));
+ }
+ strcat(t_msg, " skills");
+
+
+
+ memset(&tmp_friend, 0, sizeof(tmp_friend));
+ if ((-1) == SQL->StmtPrepare(stmt, "SELECT c.`account_id`, c.`char_id`, c.`name` FROM `%s` c LEFT JOIN `%s` f ON f.`friend_account` = c.`account_id` AND f.`friend_id` = c.`char_id` WHERE f.`char_id`=? LIMIT %d", char_db, friend_db, 40)
+ || (-1) == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &tmp_friend.account_id, 0,
+# 1275 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1275 "../../../server-code/src/char/char.c"
+ ,
+# 1275 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1275 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &tmp_friend.char_id, 0,
+# 1276 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1276 "../../../server-code/src/char/char.c"
+ ,
+# 1276 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1276 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_STRING, &tmp_friend.name, sizeof(tmp_friend.name),
+# 1277 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1277 "../../../server-code/src/char/char.c"
+ ,
+# 1277 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1277 "../../../server-code/src/char/char.c"
+ )
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1279));
+ }
+
+ for( i = 0; i < 40 && 0 == SQL->StmtNextRow(stmt); ++i )
+ memcpy(&p->friends[i], &tmp_friend, sizeof(tmp_friend));
+ strcat(t_msg, " friends");
+
+
+
+
+ memset(&tmp_hotkey, 0, sizeof(tmp_hotkey));
+ if ((-1) == SQL->StmtPrepare(stmt, "SELECT `hotkey`, `type`, `itemskill_id`, `skill_lvl` FROM `%s` WHERE `char_id`=?", hotkey_db)
+ || (-1) == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, 0)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &hotkey_num, 0,
+# 1293 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1293 "../../../server-code/src/char/char.c"
+ ,
+# 1293 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1293 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_UCHAR, &tmp_hotkey.type, 0,
+# 1294 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1294 "../../../server-code/src/char/char.c"
+ ,
+# 1294 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1294 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_UINT, &tmp_hotkey.id, 0,
+# 1295 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1295 "../../../server-code/src/char/char.c"
+ ,
+# 1295 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1295 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 3, SQLDT_USHORT, &tmp_hotkey.lv, 0,
+# 1296 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1296 "../../../server-code/src/char/char.c"
+ ,
+# 1296 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1296 "../../../server-code/src/char/char.c"
+ ) )
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1297));
+
+ while( 0 == SQL->StmtNextRow(stmt) )
+ {
+ if( hotkey_num >= 0 && hotkey_num < 38 )
+ memcpy(&p->hotkeys[hotkey_num], &tmp_hotkey, sizeof(tmp_hotkey));
+ else
+ (showmsg->showWarning(("chr->mmo_char_fromsql: ignoring invalid hotkey (hotkey=%d,type=%u,id=%u,lv=%u) of character %s (AID=%d,CID=%d)\n"), hotkey_num, tmp_hotkey.type, tmp_hotkey.id, tmp_hotkey.lv, p->name, p->account_id, p->char_id));
+ }
+ strcat(t_msg, " hotkeys");
+
+
+
+ inter_mercenary->owner_fromsql(char_id, p);
+ strcat(t_msg, " mercenary");
+
+
+ p->mod_exp = p->mod_drop = p->mod_death = 100;
+
+
+ if ((-1) == SQL->StmtPrepare(stmt, "SELECT `bank_vault`,`base_exp`,`base_drop`,`base_death` FROM `%s` WHERE `account_id`=? LIMIT 1", account_data_db)
+ || (-1) == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &account_id, 0)
+ || (-1) == SQL->StmtExecute(stmt)
+ || (-1) == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &p->bank_vault, 0,
+# 1320 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1320 "../../../server-code/src/char/char.c"
+ ,
+# 1320 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1320 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 1, SQLDT_USHORT, &p->mod_exp, 0,
+# 1321 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1321 "../../../server-code/src/char/char.c"
+ ,
+# 1321 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1321 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 2, SQLDT_USHORT, &p->mod_drop, 0,
+# 1322 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1322 "../../../server-code/src/char/char.c"
+ ,
+# 1322 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1322 "../../../server-code/src/char/char.c"
+ )
+ || (-1) == SQL->StmtBindColumn(stmt, 3, SQLDT_USHORT, &p->mod_death, 0,
+# 1323 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1323 "../../../server-code/src/char/char.c"
+ ,
+# 1323 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1323 "../../../server-code/src/char/char.c"
+ )
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 1325));
+ }
+
+ if( 0 == SQL->StmtNextRow(stmt) )
+ strcat(t_msg, " accdata");
+
+ if (save_log) (showmsg->showInfo(("Loaded char (%d - %s): %s\n"), char_id, p->name, t_msg));
+ SQL->StmtFree(stmt);
+ StrBuf->Destroy(&buf);
+
+
+ if( opt & OPT_ALLOW_PARTY )
+ p->allow_party =
+# 1337 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 1337 "../../../server-code/src/char/char.c"
+ ;
+ if( opt & OPT_SHOW_EQUIP )
+ p->show_equip =
+# 1339 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 1339 "../../../server-code/src/char/char.c"
+ ;
+
+ cp = ( DB->data2ptr((chr->char_db_)->ensure((chr->char_db_),DB->i2key(char_id),(chr->create_charstatus))) );
+ memcpy(cp, p, sizeof(struct mmo_charstatus));
+ return 1;
+}
+
+
+int char_mmo_char_sql_init(void)
+{
+ chr->char_db_= DB->alloc("../../../server-code/src/char/char.c",__func__,1349,DB_INT,(DB_OPT_RELEASE_DATA),sizeof(int));
+# 1358 "../../../server-code/src/char/char.c"
+ chr->set_all_offline_sql();
+
+ return 0;
+}
+
+
+
+# 1364 "../../../server-code/src/char/char.c" 3 4
+_Bool
+# 1364 "../../../server-code/src/char/char.c"
+ char_char_slotchange(struct char_session_data *sd, int fd, unsigned short from, unsigned short to) {
+ struct mmo_charstatus char_dat;
+ int from_id = 0;
+
+ do { if (((void)(sd),
+# 1368 "../../../server-code/src/char/char.c" 3 4
+0
+# 1368 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ if( from >= 9 || to >= 9 || ( sd->char_slots && to > sd->char_slots ) || sd->found_char[from] <= 0 )
+ return
+# 1370 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1370 "../../../server-code/src/char/char.c"
+ ;
+
+ if( !chr->mmo_char_fromsql(sd->found_char[from], &char_dat,
+# 1372 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1372 "../../../server-code/src/char/char.c"
+ ) )
+ return
+# 1373 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1373 "../../../server-code/src/char/char.c"
+ ;
+
+ if( char_dat.slotchange == 0 )
+ return
+# 1376 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1376 "../../../server-code/src/char/char.c"
+ ;
+
+ from_id = sd->found_char[from];
+
+ if( sd->found_char[to] > 0 ) {
+
+# 1381 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 1381 "../../../server-code/src/char/char.c"
+ result =
+# 1381 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1381 "../../../server-code/src/char/char.c"
+ ;
+
+ if( 0 != SQL->QueryStr(inter->sql_handle, "START TRANSACTION")
+ || 0 != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `char_num`='%d' WHERE `char_id`='%d' LIMIT 1", char_db, from, sd->found_char[to])
+ || 0 != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `char_num`='%d' WHERE `char_id`='%d' LIMIT 1", char_db, to, sd->found_char[from])
+ )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1387));
+ else
+ result =
+# 1389 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 1389 "../../../server-code/src/char/char.c"
+ ;
+
+ if( (-1) == SQL->QueryStr(inter->sql_handle, (result ==
+# 1391 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 1391 "../../../server-code/src/char/char.c"
+ ) ? "COMMIT" : "ROLLBACK") ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1392));
+ result =
+# 1393 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1393 "../../../server-code/src/char/char.c"
+ ;
+ }
+ if( !result )
+ return
+# 1396 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1396 "../../../server-code/src/char/char.c"
+ ;
+ } else {
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `char_num`='%d' WHERE `char_id`='%d' LIMIT 1", char_db, to, sd->found_char[from] ) ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1399));
+ return
+# 1400 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1400 "../../../server-code/src/char/char.c"
+ ;
+ }
+ }
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `slotchange`=`slotchange`-1 WHERE `char_id`='%d' LIMIT 1", char_db, from_id ) ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1406));
+ return
+# 1407 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1407 "../../../server-code/src/char/char.c"
+ ;
+ }
+
+ return
+# 1410 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 1410 "../../../server-code/src/char/char.c"
+ ;
+}
+
+
+
+
+int char_rename_char_sql(struct char_session_data *sd, int char_id)
+{
+ struct mmo_charstatus char_dat;
+ char esc_name[(23 + 1)*2+1];
+
+ do { if (((void)(sd),
+# 1421 "../../../server-code/src/char/char.c" 3 4
+0
+# 1421 "../../../server-code/src/char/char.c"
+)) return(2); } while(0);
+
+ if( sd->new_name[0] == 0 )
+ return 2;
+
+ if( !chr->mmo_char_fromsql(char_id, &char_dat,
+# 1426 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 1426 "../../../server-code/src/char/char.c"
+ ) )
+ return 2;
+
+ if (sd->account_id != char_dat.account_id)
+ return 2;
+
+ if( char_dat.rename == 0 )
+ return 1;
+
+ SQL->EscapeStringLen(inter->sql_handle, esc_name, sd->new_name, (strlib->strnlen_((sd->new_name),((23 + 1)))));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT 1 FROM `%s` WHERE `name` LIKE '%s' LIMIT 1", char_db, esc_name) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1440));
+ return 4;
+ }
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `name` = '%s', `rename` = '%d' WHERE `char_id` = '%d'", char_db, esc_name, --char_dat.rename, char_id) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1446));
+ return 3;
+ }
+
+
+ if( char_dat.guild_id )
+ inter_guild->charname_changed(char_dat.guild_id, sd->account_id, char_id, sd->new_name);
+
+ (strlib->safestrncpy_((char_dat.name),(sd->new_name),((23 + 1))));
+ memset(sd->new_name,0,sizeof(sd->new_name));
+
+
+ if( log_char )
+ {
+ if( (-1) == SQL->Query(inter->sql_handle,
+ "INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ "VALUES (NOW(), '%s', '%d', '%d', '%d', '%s', '0', '0', '0', '0', '0', '0', '0', '0')",
+ charlog_db, "change char name", sd->account_id, char_dat.char_id, char_dat.slot, esc_name) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1464));
+ }
+
+ return 0;
+}
+
+int char_check_char_name(char * name, char * esc_name)
+{
+ int i;
+
+ do { if (((void)(name),
+# 1474 "../../../server-code/src/char/char.c" 3 4
+0
+# 1474 "../../../server-code/src/char/char.c"
+)) return(-2); } while(0);
+ do { if (((void)(esc_name),
+# 1475 "../../../server-code/src/char/char.c" 3 4
+0
+# 1475 "../../../server-code/src/char/char.c"
+)) return(-2); } while(0);
+
+
+ if (name[0] == '\0')
+ return -2;
+
+
+
+
+ if( strlen( name ) < 4 )
+ return -2;
+
+ if( (strlib->remove_control_chars_(name)) )
+ return -2;
+
+
+ if( strcasecmp(name, wisp_server_name) == 0 )
+ return -1;
+
+
+ if( char_name_option == 1 )
+ {
+ for( i = 0; i < (23 + 1) && name[i]; i++ )
+ if( strchr(char_name_letters, name[i]) ==
+# 1498 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1498 "../../../server-code/src/char/char.c"
+ )
+ return -2;
+ }
+ else if( char_name_option == 2 )
+ {
+ for( i = 0; i < (23 + 1) && name[i]; i++ )
+ if( strchr(char_name_letters, name[i]) !=
+# 1504 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1504 "../../../server-code/src/char/char.c"
+ )
+ return -5;
+ }
+ if( name_ignoring_case ) {
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT 1 FROM `%s` WHERE BINARY `name` = '%s' LIMIT 1", char_db, esc_name) ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1509));
+ return -2;
+ }
+ } else {
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT 1 FROM `%s` WHERE `name` = '%s' LIMIT 1", char_db, esc_name) ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1514));
+ return -2;
+ }
+ }
+ if( SQL->NumRows(inter->sql_handle) > 0 )
+ return -1;
+
+ return 0;
+}
+# 1534 "../../../server-code/src/char/char.c"
+int char_make_new_char_sql(struct char_session_data *sd, const char *name_, int str, int agi, int vit, int int_, int dex, int luk, int slot, int hair_color, int hair_style)
+{
+ char name[(23 + 1)];
+ char esc_name[(23 + 1)*2+1];
+ int char_id, flag, k, l;
+
+ do { if (((void)(sd),
+# 1540 "../../../server-code/src/char/char.c" 3 4
+0
+# 1540 "../../../server-code/src/char/char.c"
+)) return(-2); } while(0);
+ do { if (((void)(name_),
+# 1541 "../../../server-code/src/char/char.c" 3 4
+0
+# 1541 "../../../server-code/src/char/char.c"
+)) return(-2); } while(0);
+ (strlib->safestrncpy_((name),(name_),((23 + 1))));
+ (strlib->normalize_name_((name),("\255\xA0\032\t\x0A\x0D ")));
+ SQL->EscapeStringLen(inter->sql_handle, esc_name, name, (strlib->strnlen_((name),((23 + 1)))));
+
+ flag = chr->check_char_name(name,esc_name);
+ if( flag < 0 )
+ return flag;
+
+
+
+ if(slot < 0 || slot >= sd->char_slots)
+
+
+
+
+
+
+
+ return -4;
+
+
+
+
+
+ if( sd->found_char[slot] != -1 )
+ return -2;
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `status_point`,`str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
+ "`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
+ "'%d', '%d', '%s', '%d', '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
+ char_db, sd->account_id , slot, esc_name, start_zeny, 48, str, agi, vit, int_, dex, luk,
+ (40 * (100 + vit)/100) , (40 * (100 + vit)/100 ), (11 * (100 + int_)/100), (11 * (100 + int_)/100), hair_style, hair_color,
+ mapindex->id2name((start_point.map),"../../../server-code/src/char/char.c", 1576, __func__), start_point.x, start_point.y, mapindex->id2name((start_point.map),"../../../server-code/src/char/char.c", 1576, __func__), start_point.x, start_point.y) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1578));
+ return -2;
+ }
+# 1595 "../../../server-code/src/char/char.c"
+ char_id = (int)SQL->LastInsertId(inter->sql_handle);
+
+ if( !char_id )
+ return -2;
+
+
+ if (log_char) {
+ if( (-1) == SQL->Query(inter->sql_handle, "INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ "VALUES (NOW(), '%s', '%d', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ charlog_db, "make new char", sd->account_id, char_id, slot, esc_name, str, agi, vit, int_, dex, luk, hair_style, hair_color) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1605));
+ }
+
+
+ for (k = 0; k < ( (int)(sizeof(start_items)/sizeof((start_items)[0])) ) && start_items[k] != 0; k += 3) {
+
+ if( start_items[k+2] == 1 )
+ {
+ if( (-1) == SQL->Query(inter->sql_handle,
+ "INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `identify`) VALUES ('%d', '%d', '%d', '%d')",
+ inventory_db, char_id, start_items[k], start_items[k + 1], 1) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1616));
+ }
+ else if( start_items[k+2] == 0 )
+ {
+
+ for( l = 0; l < start_items[k+1]; l++ )
+ {
+ if( (-1) == SQL->Query(inter->sql_handle,
+ "INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `identify`) VALUES ('%d', '%d', '%d', '%d')",
+ inventory_db, char_id, start_items[k], 1, 1)
+ )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1627));
+ }
+ }
+ }
+
+ (showmsg->showInfo(("Created char: account: %d, char: %d, slot: %d, name: %s\n"), sd->account_id, char_id, slot, name));
+ return char_id;
+}
+
+
+
+
+int char_divorce_char_sql(int partner_id1, int partner_id2)
+{
+ unsigned char buf[64];
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d' OR `char_id`='%d' LIMIT 2", char_db, partner_id1, partner_id2) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1644));
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND (`char_id`='%d' OR `char_id`='%d') LIMIT 2", inventory_db, 2634, 2635, partner_id1, partner_id2) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1646));
+
+ WBUFW(buf,0) = 0x2b12;
+ WBUFL(buf,2) = partner_id1;
+ WBUFL(buf,6) = partner_id2;
+ mapif->sendall(buf,10);
+
+ return 0;
+}
+
+
+
+
+
+
+
+int char_delete_char_sql(int char_id)
+{
+ char name[(23 + 1)];
+ char esc_name[(23 + 1)*2+1];
+ int account_id, party_id, guild_id, hom_id, base_level, partner_id, father_id, mother_id, elemental_id;
+ char *data;
+ size_t len;
+
+ if ((-1) == SQL->Query(inter->sql_handle, "SELECT `name`,`account_id`,`party_id`,`guild_id`,`base_level`,`homun_id`,`partner_id`,`father`,`mother`,`elemental_id` FROM `%s` WHERE `char_id`='%d'", char_db, char_id))
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1671));
+
+ if( 0 != SQL->NextRow(inter->sql_handle) )
+ {
+ (showmsg->showError(("chr->delete_char_sql: Unable to fetch character data, deletion aborted.\n")));
+ SQL->FreeResult(inter->sql_handle);
+ return -1;
+ }
+
+ SQL->GetData(inter->sql_handle, 0, &data, &len); (strlib->safestrncpy_((name),(data),((23 + 1))));
+ SQL->GetData(inter->sql_handle, 1, &data,
+# 1681 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1681 "../../../server-code/src/char/char.c"
+ ); account_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 2, &data,
+# 1682 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1682 "../../../server-code/src/char/char.c"
+ ); party_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 3, &data,
+# 1683 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1683 "../../../server-code/src/char/char.c"
+ ); guild_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 4, &data,
+# 1684 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1684 "../../../server-code/src/char/char.c"
+ ); base_level = atoi(data);
+ SQL->GetData(inter->sql_handle, 5, &data,
+# 1685 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1685 "../../../server-code/src/char/char.c"
+ ); hom_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 6, &data,
+# 1686 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1686 "../../../server-code/src/char/char.c"
+ ); partner_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 7, &data,
+# 1687 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1687 "../../../server-code/src/char/char.c"
+ ); father_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 8, &data,
+# 1688 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1688 "../../../server-code/src/char/char.c"
+ ); mother_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 9, &data,
+# 1689 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1689 "../../../server-code/src/char/char.c"
+ );
+ elemental_id = atoi(data);
+
+ SQL->EscapeStringLen(inter->sql_handle, esc_name, name, (((len) < ((23 + 1))) ? (len) : ((23 + 1))));
+ SQL->FreeResult(inter->sql_handle);
+
+
+
+ if( ( char_del_level > 0 && base_level >= char_del_level )
+ || ( char_del_level < 0 && base_level <= -char_del_level )
+ ) {
+ (showmsg->showInfo(("Char deletion aborted: %s, BaseLevel: %i\n"), name, base_level));
+ return -1;
+ }
+
+
+ if( partner_id )
+ chr->divorce_char_sql(char_id, partner_id);
+
+
+ if( father_id || mother_id )
+ {
+ unsigned char buf[64];
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `child`='0' WHERE `char_id`='%d' OR `char_id`='%d'", char_db, father_id, mother_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1714));
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `id` = '410'AND (`char_id`='%d' OR `char_id`='%d')", skill_db, father_id, mother_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1716));
+
+ WBUFW(buf,0) = 0x2b25;
+ WBUFL(buf,2) = father_id;
+ WBUFL(buf,6) = mother_id;
+ WBUFL(buf,10) = char_id;
+ mapif->sendall(buf,14);
+ }
+
+
+ if (party_id)
+ inter_party->leave(party_id, account_id, char_id);
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d' AND `incubate` = '0'", pet_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1732));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` USING `%s` JOIN `%s` ON `pet_id` = `card1`|`card2`<<16 WHERE `%s`.char_id = '%d' AND card0 = -256", pet_db, pet_db, inventory_db, inventory_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1736));
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` USING `%s` JOIN `%s` ON `pet_id` = `card1`|`card2`<<16 WHERE `%s`.char_id = '%d' AND card0 = -256", pet_db, pet_db, cart_db, cart_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1738));
+
+
+ if( hom_id )
+ mapif->homunculus_delete(hom_id);
+
+
+ if (elemental_id)
+ mapif->elemental_delete(elemental_id);
+
+
+ inter_mercenary->owner_delete(char_id);
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d'", friend_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1753));
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `friend_id` = '%d'", friend_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1758));
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", hotkey_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1763));
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", inventory_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1768));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", cart_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1772));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", memo_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1776));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", char_reg_str_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1780));
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", char_reg_num_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1782));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", skill_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1786));
+
+
+ if ((-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `dest_id`='%d'", mail_db, char_id))
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1790));
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", scdata_db, account_id, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1795));
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", char_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1800));
+ else if( log_char ) {
+ if( (-1) == SQL->Query(inter->sql_handle,
+ "INSERT INTO `%s`(`time`, `account_id`, `char_id`, `char_num`, `char_msg`, `name`)"
+ " VALUES (NOW(), '%d', '%d', '%d', 'Deleted character', '%s')",
+ charlog_db, account_id, char_id, 0, esc_name) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1806));
+ }
+
+
+
+
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `guild_id` FROM `%s` WHERE `char_id` = '%d'", guild_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1816));
+ else if( SQL->NumRows(inter->sql_handle) > 0 )
+ mapif->parse_BreakGuild(0,guild_id);
+ else if( guild_id )
+ inter_guild->leave(guild_id, account_id, char_id);
+ return 0;
+}
+
+
+
+
+int char_count_users(void)
+{
+ int i, users;
+
+ users = 0;
+ for(i = 0; i < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ); i++) {
+ if (chr->server[i].fd > 0) {
+ users += chr->server[i].users;
+ }
+ }
+ return users;
+}
+
+
+
+
+
+int char_mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p) {
+ unsigned short offset = 0;
+ uint8* buf;
+
+ if( buffer ==
+# 1848 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1848 "../../../server-code/src/char/char.c"
+ || p ==
+# 1848 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1848 "../../../server-code/src/char/char.c"
+ )
+ return 0;
+
+ buf = WBUFP(buffer,0);
+ WBUFL(buf,0) = p->char_id;
+ WBUFL(buf,4) = (((p->base_exp) < (
+# 1853 "../../../server-code/src/char/char.c" 3 4
+ (2147483647)
+# 1853 "../../../server-code/src/char/char.c"
+ )) ? (p->base_exp) : (
+# 1853 "../../../server-code/src/char/char.c" 3 4
+ (2147483647)
+# 1853 "../../../server-code/src/char/char.c"
+ ));
+ WBUFL(buf,8) = p->zeny;
+ WBUFL(buf,12) = (((p->job_exp) < (
+# 1855 "../../../server-code/src/char/char.c" 3 4
+ (2147483647)
+# 1855 "../../../server-code/src/char/char.c"
+ )) ? (p->job_exp) : (
+# 1855 "../../../server-code/src/char/char.c" 3 4
+ (2147483647)
+# 1855 "../../../server-code/src/char/char.c"
+ ));
+ WBUFL(buf,16) = p->job_level;
+ WBUFL(buf,20) = 0;
+ WBUFL(buf,24) = 0;
+ WBUFL(buf,28) = (p->option &~ 0x40);
+ WBUFL(buf,32) = p->karma;
+ WBUFL(buf,36) = p->manner;
+ WBUFW(buf,40) = (((p->status_point) < (
+# 1862 "../../../server-code/src/char/char.c" 3 4
+ (32767)
+# 1862 "../../../server-code/src/char/char.c"
+ )) ? (p->status_point) : (
+# 1862 "../../../server-code/src/char/char.c" 3 4
+ (32767)
+# 1862 "../../../server-code/src/char/char.c"
+ ));
+
+ WBUFL(buf,42) = p->hp;
+ WBUFL(buf,46) = p->max_hp;
+ offset+=4;
+ buf = WBUFP(buffer,offset);
+
+
+
+
+ WBUFW(buf,46) = (((p->sp) < (
+# 1872 "../../../server-code/src/char/char.c" 3 4
+ (32767)
+# 1872 "../../../server-code/src/char/char.c"
+ )) ? (p->sp) : (
+# 1872 "../../../server-code/src/char/char.c" 3 4
+ (32767)
+# 1872 "../../../server-code/src/char/char.c"
+ ));
+ WBUFW(buf,48) = (((p->max_sp) < (
+# 1873 "../../../server-code/src/char/char.c" 3 4
+ (32767)
+# 1873 "../../../server-code/src/char/char.c"
+ )) ? (p->max_sp) : (
+# 1873 "../../../server-code/src/char/char.c" 3 4
+ (32767)
+# 1873 "../../../server-code/src/char/char.c"
+ ));
+ WBUFW(buf,50) = 150;
+ WBUFW(buf,52) = p->class_;
+ WBUFW(buf,54) = p->hair;
+# 1885 "../../../server-code/src/char/char.c"
+ WBUFW(buf,56) = p->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUG|OPTION_WUGRIDER|OPTION_MADOGEAR|OPTION_HANBOK) ? 0 : p->weapon;
+
+ WBUFW(buf,58) = p->base_level;
+ WBUFW(buf,60) = (((p->skill_point) < (
+# 1888 "../../../server-code/src/char/char.c" 3 4
+ (32767)
+# 1888 "../../../server-code/src/char/char.c"
+ )) ? (p->skill_point) : (
+# 1888 "../../../server-code/src/char/char.c" 3 4
+ (32767)
+# 1888 "../../../server-code/src/char/char.c"
+ ));
+ WBUFW(buf,62) = p->head_bottom;
+ WBUFW(buf,64) = p->shield;
+ WBUFW(buf,66) = p->head_top;
+ WBUFW(buf,68) = p->head_mid;
+ WBUFW(buf,70) = p->hair_color;
+ WBUFW(buf,72) = p->clothes_color;
+ memcpy(WBUFP(buf,74), p->name, (23 + 1));
+ WBUFB(buf,98) = (((p->str) < (((uint8) 0xFF))) ? (p->str) : (((uint8) 0xFF)));
+ WBUFB(buf,99) = (((p->agi) < (((uint8) 0xFF))) ? (p->agi) : (((uint8) 0xFF)));
+ WBUFB(buf,100) = (((p->vit) < (((uint8) 0xFF))) ? (p->vit) : (((uint8) 0xFF)));
+ WBUFB(buf,101) = (((p->int_) < (((uint8) 0xFF))) ? (p->int_) : (((uint8) 0xFF)));
+ WBUFB(buf,102) = (((p->dex) < (((uint8) 0xFF))) ? (p->dex) : (((uint8) 0xFF)));
+ WBUFB(buf,103) = (((p->luk) < (((uint8) 0xFF))) ? (p->luk) : (((uint8) 0xFF)));
+ WBUFW(buf,104) = p->slot;
+
+ WBUFW(buf,106) = ( p->rename > 0 ) ? 0 : 1;
+ offset += 2;
+
+
+ mapindex->getmapname_ext(mapindex->id2name((p->last_point.map),"../../../server-code/src/char/char.c", 1908, __func__), WBUFP(buf,108));
+ offset += ((11 + 1) + 4);
+
+
+ WBUFL(buf,124) = (int)p->delete_date;
+ offset += 4;
+
+
+ WBUFL(buf,128) = p->robe;
+ offset += 4;
+
+
+
+ WBUFL(buf,132) = ( p->slotchange > 0 ) ? 1 : 0;
+ offset += 4;
+
+
+ WBUFL(buf,136) = ( p->rename > 0 ) ? 1 : 0;
+ offset += 4;
+
+
+
+
+
+
+
+ return 106+offset;
+}
+
+
+void char_mmo_char_send099d(int fd, struct char_session_data *sd) {
+ WFIFOHEAD(fd,4 + (9*150));
+ WFIFOW(fd,0) = 0x99d;
+ WFIFOW(fd,2) = chr->mmo_chars_fromsql(sd, WFIFOP(fd,4)) + 4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+}
+
+
+
+void char_mmo_char_send_ban_list(int fd, struct char_session_data *sd) {
+ int i;
+ time_t now = time(
+# 1949 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 1949 "../../../server-code/src/char/char.c"
+ );
+
+ do { if (((void)(sd),
+# 1951 "../../../server-code/src/char/char.c" 3 4
+0
+# 1951 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+ do { for ((i) = (0); (i) < (9); ++(i)) if (sd->unban_time[i]) break; } while(
+# 1952 "../../../server-code/src/char/char.c" 3 4
+0
+# 1952 "../../../server-code/src/char/char.c"
+);
+ if( i != 9 ) {
+ int c;
+
+ WFIFOHEAD(fd, 4 + (9*24));
+
+ WFIFOW(fd,0) = 0x20d;
+
+ for(i = 0, c = 0; i < 9; i++) {
+ if( sd->unban_time[i] ) {
+ timestamp2string(WFIFOP(fd,8 + (28*c)), 20, sd->unban_time[i], "%Y-%m-%d %H:%M:%S");
+
+ if( sd->unban_time[i] > now )
+ WFIFOL(fd, 4 + (24*c)) = sd->found_char[i];
+ else {
+
+ WFIFOL(fd, 4 + (24*c)) = 0;
+
+ sd->unban_time[i] = 0;
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `unban_time`='0' WHERE `char_id`='%d' LIMIT 1", char_db, sd->found_char[i]) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1972));
+ }
+ c++;
+ }
+ }
+
+ WFIFOW(fd,2) = 4 + (24*c);
+
+ WFIFOSET(fd, WFIFOW(fd,2));
+ }
+}
+
+
+
+
+void char_mmo_char_send_slots_info(int fd, struct char_session_data* sd) {
+ do { if (((void)(sd),
+# 1988 "../../../server-code/src/char/char.c" 3 4
+0
+# 1988 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+ WFIFOHEAD(fd,29);
+ WFIFOW(fd,0) = 0x82d;
+ WFIFOW(fd,2) = 29;
+ WFIFOB(fd,4) = sd->char_slots;
+ WFIFOB(fd,5) = 9 - sd->char_slots;
+ WFIFOB(fd,6) = 0;
+ WFIFOB(fd,7) = sd->char_slots;
+ WFIFOB(fd,8) = sd->char_slots;
+ memset(WFIFOP(fd,9), 0, 20);
+ WFIFOSET(fd,29);
+}
+
+
+
+int char_mmo_char_send_characters(int fd, struct char_session_data* sd)
+{
+ int j, offset = 0;
+ do { if (((void)(sd),
+# 2006 "../../../server-code/src/char/char.c" 3 4
+0
+# 2006 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+
+ offset += 3;
+
+ if (save_log)
+ (showmsg->showInfo(("Loading Char Data (""\033[1m""%d""\033[0m"")\n"),sd->account_id));
+
+ j = 24 + offset;
+ WFIFOHEAD(fd,j + 9*150);
+ WFIFOW(fd,0) = 0x6b;
+
+ WFIFOB(fd,4) = 9;
+ WFIFOB(fd,5) = sd->char_slots;
+ WFIFOB(fd,6) = 9;
+
+ memset(WFIFOP(fd,4 + offset), 0, 20);
+ j+=chr->mmo_chars_fromsql(sd, WFIFOP(fd,j));
+ WFIFOW(fd,2) = j;
+ WFIFOSET(fd,j);
+
+ return 0;
+}
+
+int char_char_married(int pl1, int pl2)
+{
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `partner_id` FROM `%s` WHERE `char_id` = '%d'", char_db, pl1) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2032));
+ else if( 0 == SQL->NextRow(inter->sql_handle) )
+ {
+ char* data;
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 2037 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2037 "../../../server-code/src/char/char.c"
+ );
+ if( pl2 == atoi(data) )
+ {
+ SQL->FreeResult(inter->sql_handle);
+ return 1;
+ }
+ }
+ SQL->FreeResult(inter->sql_handle);
+ return 0;
+}
+
+int char_char_child(int parent_id, int child_id)
+{
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2051));
+ else if( 0 == SQL->NextRow(inter->sql_handle) )
+ {
+ char* data;
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 2056 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2056 "../../../server-code/src/char/char.c"
+ );
+ if( child_id == atoi(data) )
+ {
+ SQL->FreeResult(inter->sql_handle);
+ return 1;
+ }
+ }
+ SQL->FreeResult(inter->sql_handle);
+ return 0;
+}
+
+int char_char_family(int cid1, int cid2, int cid3)
+{
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `char_id`,`partner_id`,`child` FROM `%s` WHERE `char_id` IN ('%d','%d','%d')", char_db, cid1, cid2, cid3) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2070));
+ else while( 0 == SQL->NextRow(inter->sql_handle) )
+ {
+ int charid;
+ int partnerid;
+ int childid;
+ char* data;
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 2078 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2078 "../../../server-code/src/char/char.c"
+ ); charid = atoi(data);
+ SQL->GetData(inter->sql_handle, 1, &data,
+# 2079 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2079 "../../../server-code/src/char/char.c"
+ ); partnerid = atoi(data);
+ SQL->GetData(inter->sql_handle, 2, &data,
+# 2080 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2080 "../../../server-code/src/char/char.c"
+ ); childid = atoi(data);
+
+ if( (cid1 == charid && ((cid2 == partnerid && cid3 == childid ) || (cid2 == childid && cid3 == partnerid))) ||
+ (cid1 == partnerid && ((cid2 == charid && cid3 == childid ) || (cid2 == childid && cid3 == charid ))) ||
+ (cid1 == childid && ((cid2 == charid && cid3 == partnerid) || (cid2 == partnerid && cid3 == charid ))) )
+ {
+ SQL->FreeResult(inter->sql_handle);
+ return childid;
+ }
+ }
+ SQL->FreeResult(inter->sql_handle);
+ return 0;
+}
+
+
+
+
+void char_disconnect_player(int account_id)
+{
+ int i;
+ struct char_session_data* sd;
+
+
+ do { for ((i) = (0); (i) < (sockt->fd_max); ++(i)) if (sockt->session[i] && (sd = (struct char_session_data*)sockt->session[i]->session_data) && sd->account_id == account_id) break; } while(
+# 2103 "../../../server-code/src/char/char.c" 3 4
+0
+# 2103 "../../../server-code/src/char/char.c"
+);
+ if( i < sockt->fd_max )
+ sockt->eof(i);
+}
+
+void char_authfail_fd(int fd, int type)
+{
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = type;
+ WFIFOSET(fd,3);
+}
+
+void char_request_account_data(int account_id)
+{
+ WFIFOHEAD(chr->login_fd,6);
+ WFIFOW(chr->login_fd,0) = 0x2716;
+ WFIFOL(chr->login_fd,2) = account_id;
+ WFIFOSET(chr->login_fd,6);
+}
+
+static void char_auth_ok(int fd, struct char_session_data *sd)
+{
+ struct online_char_data* character;
+
+ do { if (((void)(sd),
+# 2128 "../../../server-code/src/char/char.c" 3 4
+0
+# 2128 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+
+ if( (character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->get((chr->online_char_db),DB->i2key(sd->account_id))) )) !=
+# 2130 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2130 "../../../server-code/src/char/char.c"
+ ) {
+
+ if (character->server > -1) {
+
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2);
+ if (character->waiting_disconnect == (-1))
+ character->waiting_disconnect = timer->add(timer->gettick()+20000, chr->waiting_disconnect, character->account_id, 0);
+ character->pincode_enable = -1;
+ chr->authfail_fd(fd, 8);
+ return;
+ }
+ if (character->fd >= 0 && character->fd != fd) {
+
+ chr->authfail_fd(fd, 8);
+ return;
+ }
+ character->fd = fd;
+ }
+
+ if (chr->login_fd > 0) {
+ chr->request_account_data(sd->account_id);
+ }
+
+
+ sd->auth =
+# 2154 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 2154 "../../../server-code/src/char/char.c"
+ ;
+
+
+ chr->set_char_charselect(sd->account_id);
+
+
+}
+
+void char_ping_login_server(int fd)
+{
+ WFIFOHEAD(fd,2);
+ WFIFOW(fd,0) = 0x2719;
+ WFIFOSET(fd,2);
+}
+
+int char_parse_fromlogin_connection_state(int fd)
+{
+ if (RFIFOB(fd,2)) {
+
+ (showmsg->showError(("Can not connect to login-server.\n")));
+ (showmsg->showError(("The server communication passwords (default s1/p1) are probably invalid.\n")));
+ (showmsg->showError(("Also, please make sure your login db has the correct communication username/passwords and the gender of the account is S.\n")));
+ (showmsg->showError(("The communication passwords are set in /conf/map-server.conf and /conf/char-server.conf\n")));
+ sockt->eof(fd);
+ return 1;
+ } else {
+ (showmsg->showStatus(("Connected to login-server (connection #%d).\n"), fd));
+ loginif->on_ready();
+ }
+ RFIFOSKIP(fd,3);
+ return 0;
+}
+
+
+
+void char_auth_error(int fd, unsigned char flag)
+{
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x6c;
+ WFIFOB(fd,2) = flag;
+ WFIFOSET(fd,3);
+}
+
+void char_parse_fromlogin_auth_state(int fd)
+{
+ struct char_session_data* sd =
+# 2199 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2199 "../../../server-code/src/char/char.c"
+ ;
+ int account_id = RFIFOL(fd,2);
+ uint32 login_id1 = RFIFOL(fd,6);
+ uint32 login_id2 = RFIFOL(fd,10);
+ uint8 sex = RFIFOB(fd,14);
+ uint8 result = RFIFOB(fd,15);
+ int request_id = RFIFOL(fd,16);
+ uint32 version = RFIFOL(fd,20);
+ uint8 clienttype = RFIFOB(fd,24);
+ int group_id = RFIFOL(fd,25);
+ unsigned int expiration_time = RFIFOL(fd, 29);
+ RFIFOSKIP(fd,33);
+
+ if (sockt->session_is_active(request_id) && (sd=(struct char_session_data*)sockt->session[request_id]->session_data) &&
+ !sd->auth && sd->account_id == account_id && sd->login_id1 == login_id1 && sd->login_id2 == login_id2 && sd->sex == sex )
+ {
+ int client_fd = request_id;
+ sd->version = version;
+ sd->clienttype = clienttype;
+ switch( result ) {
+ case 0:
+
+ if( chr->server_type == CST_MAINTENANCE && group_id < char_maintenance_min_group_id ) {
+ chr->auth_error(client_fd, 0);
+ break;
+ }
+
+ if( chr->server_type == CST_PAYING && (time_t)expiration_time < time(
+# 2226 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2226 "../../../server-code/src/char/char.c"
+ ) ) {
+ chr->auth_error(client_fd, 0);
+ break;
+ }
+ chr->auth_ok(client_fd, sd);
+ break;
+ case 1:
+ chr->auth_error(client_fd, 0);
+ break;
+ }
+ }
+}
+
+void char_parse_fromlogin_account_data(int fd)
+{
+ struct char_session_data* sd = (struct char_session_data*)sockt->session[fd]->session_data;
+ int i;
+
+ do { for ((i) = (0); (i) < (sockt->fd_max); ++(i)) if (sockt->session[i] && (sd = (struct char_session_data*)sockt->session[i]->session_data) && sd->auth && sd->account_id == RFIFOL(fd,2)) break; } while(
+# 2244 "../../../server-code/src/char/char.c" 3 4
+0
+# 2244 "../../../server-code/src/char/char.c"
+);
+ if( i < sockt->fd_max ) {
+ memcpy(sd->email, RFIFOP(fd,6), 40);
+ sd->expiration_time = (time_t)RFIFOL(fd,46);
+ sd->group_id = RFIFOB(fd,50);
+ sd->char_slots = RFIFOB(fd,51);
+ if( sd->char_slots > 9 ) {
+ (showmsg->showError(("Account '%d' `character_slots` column is higher than supported MAX_CHARS (%d), update MAX_CHARS in mmo.h! capping to MAX_CHARS...\n"),sd->account_id,sd->char_slots));
+ sd->char_slots = 9;
+ } else if ( sd->char_slots <= 0 )
+ sd->char_slots = 9;
+ (strlib->safestrncpy_((sd->birthdate),(RFIFOP(fd,52)),(sizeof(sd->birthdate))));
+ (strlib->safestrncpy_((sd->pincode),(RFIFOP(fd,63)),(sizeof(sd->pincode))));
+ sd->pincode_change = RFIFOL(fd,68);
+
+ if( (max_connect_user == 0 && sd->group_id != gm_allow_group) ||
+ ( max_connect_user > 0 && chr->count_users() >= max_connect_user && sd->group_id != gm_allow_group ) ) {
+
+ chr->auth_error(i, 0);
+ } else {
+
+
+ chr->mmo_char_send_slots_info(i, sd);
+ chr->mmo_char_send_characters(i, sd);
+
+
+
+
+ chr->mmo_char_send_ban_list(i, sd);
+
+
+ pincode->handle(i, sd);
+
+ }
+ }
+ RFIFOSKIP(fd,72);
+}
+
+void char_parse_fromlogin_login_pong(int fd)
+{
+ RFIFOSKIP(fd,2);
+ if (sockt->session[fd])
+ sockt->session[fd]->flag.ping = 0;
+}
+
+void char_changesex(int account_id, int sex)
+{
+ unsigned char buf[7];
+
+ WBUFW(buf,0) = 0x2b0d;
+ WBUFL(buf,2) = account_id;
+ WBUFB(buf,6) = sex;
+ mapif->sendall(buf, 7);
+}
+# 2310 "../../../server-code/src/char/char.c"
+void char_change_sex_sub(int sex, int acc, int char_id, int class_, int guild_id)
+{
+
+ if (class_ == JOB_BARD || class_ == JOB_DANCER)
+ class_ = (sex == SEX_MALE ? JOB_BARD : JOB_DANCER);
+ else if (class_ == JOB_CLOWN || class_ == JOB_GYPSY)
+ class_ = (sex == SEX_MALE ? JOB_CLOWN : JOB_GYPSY);
+ else if (class_ == JOB_BABY_BARD || class_ == JOB_BABY_DANCER)
+ class_ = (sex == SEX_MALE ? JOB_BABY_BARD : JOB_BABY_DANCER);
+ else if (class_ == JOB_MINSTREL || class_ == JOB_WANDERER)
+ class_ = (sex == SEX_MALE ? JOB_MINSTREL : JOB_WANDERER);
+ else if (class_ == JOB_MINSTREL_T || class_ == JOB_WANDERER_T)
+ class_ = (sex == SEX_MALE ? JOB_MINSTREL_T : JOB_WANDERER_T);
+ else if (class_ == JOB_BABY_MINSTREL || class_ == JOB_BABY_WANDERER)
+ class_ = (sex == SEX_MALE ? JOB_BABY_MINSTREL : JOB_BABY_WANDERER);
+ else if (class_ == JOB_KAGEROU || class_ == JOB_OBORO)
+ class_ = (sex == SEX_MALE ? JOB_KAGEROU : JOB_OBORO);
+
+ if ((-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `equip`='0' WHERE `char_id`='%d'", inventory_db, char_id))
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2329));
+
+ if ((-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `class`='%d', `weapon`='0', `shield`='0', "
+ "`head_top`='0', `head_mid`='0', `head_bottom`='0' WHERE `char_id`='%d'",
+ char_db, class_, char_id))
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2334));
+ if (guild_id)
+ inter_guild->sex_changed(guild_id, acc, char_id, sex);
+}
+
+int char_parse_fromlogin_changesex_reply(int fd)
+{
+ int char_id = 0, class_ = 0, guild_id = 0;
+ int i;
+ struct char_auth_node *node;
+ struct SqlStmt *stmt;
+
+ int acc = RFIFOL(fd,2);
+ int sex = RFIFOB(fd,6);
+
+ RFIFOSKIP(fd,7);
+
+
+ if (acc <= 0) {
+ (showmsg->showError(("Received invalid account id from login server! (aid: %d)\n"), acc));
+ return 1;
+ }
+
+ node = (struct char_auth_node*)( DB->data2ptr((auth_db)->get((auth_db),DB->i2key(acc))) );
+ if (node !=
+# 2358 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2358 "../../../server-code/src/char/char.c"
+ )
+ node->sex = sex;
+
+
+ stmt = SQL->StmtMalloc(inter->sql_handle);
+ if ((-1) == SQL->StmtPrepare(stmt, "SELECT `char_id`,`class`,`guild_id` FROM `%s` WHERE `account_id` = '%d'", char_db, acc)
+ || (-1) == SQL->StmtExecute(stmt)
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 2366));
+ SQL->StmtFree(stmt);
+ }
+ SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &char_id, 0,
+# 2369 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2369 "../../../server-code/src/char/char.c"
+ ,
+# 2369 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2369 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 1, SQLDT_INT, &class_, 0,
+# 2370 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2370 "../../../server-code/src/char/char.c"
+ ,
+# 2370 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2370 "../../../server-code/src/char/char.c"
+ );
+ SQL->StmtBindColumn(stmt, 2, SQLDT_INT, &guild_id, 0,
+# 2371 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2371 "../../../server-code/src/char/char.c"
+ ,
+# 2371 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2371 "../../../server-code/src/char/char.c"
+ );
+
+ for (i = 0; i < 9 && 0 == SQL->StmtNextRow(stmt); ++i) {
+ char_change_sex_sub(sex, acc, char_id, class_, guild_id);
+ }
+ SQL->StmtFree(stmt);
+
+
+ chr->disconnect_player(acc);
+
+
+ chr->changesex(acc, sex);
+ return 0;
+}
+
+void char_parse_fromlogin_account_reg2(int fd)
+{
+
+ mapif->sendall(RFIFOP(fd, 0), RFIFOW(fd,2));
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+}
+
+void mapif_ban(int id, unsigned int flag, int status)
+{
+
+ unsigned char buf[11];
+ WBUFW(buf,0) = 0x2b14;
+ WBUFL(buf,2) = id;
+ WBUFB(buf,6) = flag;
+ WBUFL(buf,7) = status;
+ mapif->sendall(buf, 11);
+}
+
+void char_parse_fromlogin_ban(int fd)
+{
+ mapif->ban(RFIFOL(fd,2), RFIFOB(fd,6), RFIFOL(fd,7));
+
+ chr->disconnect_player(RFIFOL(fd,2));
+ RFIFOSKIP(fd,11);
+}
+
+void char_parse_fromlogin_kick(int fd)
+{
+ int aid = RFIFOL(fd,2);
+ struct online_char_data* character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->get((chr->online_char_db),DB->i2key(aid))) );
+ RFIFOSKIP(fd,6);
+ if( character !=
+# 2417 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2417 "../../../server-code/src/char/char.c"
+ )
+ {
+ if( character->server > -1 ) {
+
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2);
+ if (character->waiting_disconnect == (-1))
+ character->waiting_disconnect = timer->add(timer->gettick()+30000, chr->waiting_disconnect, character->account_id, 0);
+ }
+ else
+ {
+ struct char_session_data *tsd;
+ int i;
+ do { for ((i) = (0); (i) < (sockt->fd_max); ++(i)) if (sockt->session[i] && (tsd = (struct char_session_data*)sockt->session[i]->session_data) && tsd->account_id == aid) break; } while(
+# 2429 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 2429 "../../../server-code/src/char/char.c"
+ );
+ if( i < sockt->fd_max )
+ {
+ chr->authfail_fd(i, 2);
+ sockt->eof(i);
+ }
+ else
+ chr->set_char_offline(-1, aid);
+ }
+ }
+ ( (auth_db)->remove((auth_db),DB->i2key(aid),
+# 2439 "../../../server-code/src/char/char.c" 3 4
+((void *)0)
+# 2439 "../../../server-code/src/char/char.c"
+) );
+}
+
+void char_update_ip(int fd)
+{
+ WFIFOHEAD(fd,6);
+ WFIFOW(fd,0) = 0x2736;
+ WFIFOL(fd,2) = htonl(chr->ip);
+ WFIFOSET(fd,6);
+}
+
+void char_parse_fromlogin_update_ip(int fd)
+{
+ unsigned char buf[2];
+ uint32 new_ip = 0;
+
+ WBUFW(buf,0) = 0x2b1e;
+ mapif->sendall(buf, 2);
+
+ new_ip = sockt->host2ip(login_ip_str);
+ if (new_ip && new_ip != login_ip)
+ login_ip = new_ip;
+
+ new_ip = sockt->host2ip(char_ip_str);
+ if (new_ip && new_ip != chr->ip) {
+
+ chr->ip = new_ip;
+ (showmsg->showInfo(("Updating IP for [%s].\n"), char_ip_str));
+
+ chr->update_ip(fd);
+ }
+ RFIFOSKIP(fd,2);
+}
+
+void char_parse_fromlogin_accinfo2_failed(int fd)
+{
+ mapif->parse_accinfo2(
+# 2475 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 2475 "../../../server-code/src/char/char.c"
+ , RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14),
+
+# 2476 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2476 "../../../server-code/src/char/char.c"
+ ,
+# 2476 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2476 "../../../server-code/src/char/char.c"
+ ,
+# 2476 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2476 "../../../server-code/src/char/char.c"
+ ,
+# 2476 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2476 "../../../server-code/src/char/char.c"
+ ,
+# 2476 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2476 "../../../server-code/src/char/char.c"
+ ,
+# 2476 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2476 "../../../server-code/src/char/char.c"
+ ,
+# 2476 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2476 "../../../server-code/src/char/char.c"
+ , -1, 0, 0);
+ RFIFOSKIP(fd,18);
+}
+
+void char_parse_fromlogin_accinfo2_ok(int fd)
+{
+ mapif->parse_accinfo2(
+# 2482 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 2482 "../../../server-code/src/char/char.c"
+ , RFIFOL(fd,167), RFIFOL(fd,171), RFIFOL(fd,175), RFIFOL(fd,179),
+ RFIFOP(fd,2), RFIFOP(fd,26), RFIFOP(fd,59), RFIFOP(fd,99), RFIFOP(fd,119),
+ RFIFOP(fd,151), RFIFOP(fd,156), RFIFOL(fd,115), RFIFOL(fd,143), RFIFOL(fd,147));
+ RFIFOSKIP(fd,183);
+}
+
+int char_parse_fromlogin(int fd) {
+
+ if( fd != chr->login_fd ) {
+ (showmsg->showDebug(("chr->parse_fromlogin: Disconnecting invalid session #%d (is not the login-server)\n"), fd));
+ sockt->close(fd);
+ return 0;
+ }
+
+ if( sockt->session[fd]->flag.eof ) {
+ sockt->close(fd);
+ chr->login_fd = -1;
+ loginif->on_disconnect();
+ return 0;
+ } else if ( sockt->session[fd]->flag.ping ) {
+ if( ((sockt->last_tick)-(sockt->session[fd]->rdata_tick)) > (sockt->stall_time * 2) ) {
+ sockt->eof(fd);
+ return 0;
+ } else if( sockt->session[fd]->flag.ping != 2 ) {
+ chr->ping_login_server(fd);
+ sockt->session[fd]->flag.ping = 2;
+ }
+ }
+
+ while (RFIFOREST(fd) >= 2) {
+ uint16 command = RFIFOW(fd,0);
+
+ if (( (HPM->packets[hpParse_FromLogin])._len_ ) > 0) {
+ int result = HPM->parse_packets(fd,command,hpParse_FromLogin);
+ if (result == 1)
+ continue;
+ if (result == 2)
+ return 0;
+ }
+
+ switch (command) {
+
+ case 0x2711:
+ if (RFIFOREST(fd) < 3)
+ return 0;
+ if (chr->parse_fromlogin_connection_state(fd))
+ return 0;
+ break;
+
+
+ case 0x2713:
+ if (RFIFOREST(fd) < 33)
+ return 0;
+ {
+ chr->parse_fromlogin_auth_state(fd);
+ }
+ break;
+
+ case 0x2717:
+ {
+ if (RFIFOREST(fd) < 72)
+ return 0;
+ chr->parse_fromlogin_account_data(fd);
+ }
+ break;
+
+
+ case 0x2718:
+ if (RFIFOREST(fd) < 2)
+ return 0;
+ chr->parse_fromlogin_login_pong(fd);
+ break;
+
+
+ case 0x2723:
+ if (RFIFOREST(fd) < 7)
+ return 0;
+ {
+ if (chr->parse_fromlogin_changesex_reply(fd))
+ return 0;
+ }
+ break;
+
+
+ case 0x3804:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ chr->parse_fromlogin_account_reg2(fd);
+ break;
+
+
+ case 0x2731:
+ if (RFIFOREST(fd) < 11)
+ return 0;
+ chr->parse_fromlogin_ban(fd);
+ break;
+
+
+ case 0x2734:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ chr->parse_fromlogin_kick(fd);
+ }
+ break;
+
+
+ case 0x2735:
+ {
+ chr->parse_fromlogin_update_ip(fd);
+ }
+ break;
+
+ case 0x2736:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+
+ chr->parse_fromlogin_accinfo2_failed(fd);
+ break;
+
+ case 0x2737:
+ if (RFIFOREST(fd) < 183)
+ return 0;
+
+ chr->parse_fromlogin_accinfo2_ok(fd);
+ break;
+
+ default:
+ (showmsg->showError(("Unknown packet 0x%04x received from login-server, disconnecting.\n"), command));
+ sockt->eof(fd);
+ return 0;
+ }
+ }
+
+ RFIFOFLUSH(fd);
+ return 0;
+}
+
+int char_request_accreg2(int account_id, int char_id)
+{
+ if (chr->login_fd > 0) {
+ WFIFOHEAD(chr->login_fd,10);
+ WFIFOW(chr->login_fd,0) = 0x272e;
+ WFIFOL(chr->login_fd,2) = account_id;
+ WFIFOL(chr->login_fd,6) = char_id;
+ WFIFOSET(chr->login_fd,10);
+ return 1;
+ }
+ return 0;
+}
+
+
+
+
+void char_global_accreg_to_login_start (int account_id, int char_id) {
+ WFIFOHEAD(chr->login_fd, 60000 + 300);
+ WFIFOW(chr->login_fd,0) = 0x2728;
+ WFIFOW(chr->login_fd,2) = 14;
+ WFIFOL(chr->login_fd,4) = account_id;
+ WFIFOL(chr->login_fd,8) = char_id;
+ WFIFOW(chr->login_fd,12) = 0;
+}
+
+
+
+
+void char_global_accreg_to_login_send (void) {
+ WFIFOSET(chr->login_fd, WFIFOW(chr->login_fd,2));
+}
+
+
+
+
+void char_global_accreg_to_login_add (const char *key, unsigned int index, intptr_t val,
+# 2655 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 2655 "../../../server-code/src/char/char.c"
+ is_string) {
+ int nlen = WFIFOW(chr->login_fd,2);
+ size_t len = strlen(key)+1;
+
+ WFIFOB(chr->login_fd, nlen) = (unsigned char)len;
+ nlen += 1;
+
+ (strlib->safestrncpy_((WFIFOP(chr->login_fd,nlen)),(key),(len)));
+ nlen += len;
+
+ WFIFOL(chr->login_fd, nlen) = index;
+ nlen += 4;
+
+ if( is_string ) {
+ WFIFOB(chr->login_fd, nlen) = val ? 2 : 3;
+ nlen += 1;
+
+ if( val ) {
+ char *sval = (char*)val;
+ len = strlen(sval)+1;
+
+ WFIFOB(chr->login_fd, nlen) = (unsigned char)len;
+ nlen += 1;
+
+ (strlib->safestrncpy_((WFIFOP(chr->login_fd,nlen)),(sval),(len)));
+ nlen += len;
+ }
+ } else {
+ WFIFOB(chr->login_fd, nlen) = val ? 0 : 1;
+ nlen += 1;
+
+ if( val ) {
+ WFIFOL(chr->login_fd, nlen) = (int)val;
+ nlen += 4;
+ }
+ }
+
+ WFIFOW(chr->login_fd,12) += 1;
+
+ WFIFOW(chr->login_fd,2) = nlen;
+ if( WFIFOW(chr->login_fd,2) > 60000 ) {
+ int account_id = WFIFOL(chr->login_fd,4), char_id = WFIFOL(chr->login_fd,8);
+ chr->global_accreg_to_login_send();
+ chr->global_accreg_to_login_start(account_id,char_id);
+ }
+}
+
+void char_read_fame_list(void) {
+ int i;
+ char* data;
+ size_t len;
+
+
+ memset(smith_fame_list, 0, sizeof(smith_fame_list));
+ memset(chemist_fame_list, 0, sizeof(chemist_fame_list));
+ memset(taekwon_fame_list, 0, sizeof(taekwon_fame_list));
+
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, JOB_MECHANIC, JOB_MECHANIC_T, JOB_BABY_MECHANIC, fame_list_size_smith) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2713));
+ for( i = 0; i < fame_list_size_smith && 0 == SQL->NextRow(inter->sql_handle); ++i )
+ {
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 2717 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2717 "../../../server-code/src/char/char.c"
+ );
+ smith_fame_list[i].id = atoi(data);
+
+ SQL->GetData(inter->sql_handle, 1, &data, &len);
+ smith_fame_list[i].fame = atoi(data);
+
+ SQL->GetData(inter->sql_handle, 2, &data, &len);
+ memcpy(smith_fame_list[i].name, data, (((len) < ((23 + 1))) ? (len) : ((23 + 1))));
+ }
+
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, JOB_GENETIC, JOB_GENETIC_T, JOB_BABY_GENETIC, fame_list_size_chemist) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2728));
+ for( i = 0; i < fame_list_size_chemist && 0 == SQL->NextRow(inter->sql_handle); ++i )
+ {
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 2732 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2732 "../../../server-code/src/char/char.c"
+ );
+ chemist_fame_list[i].id = atoi(data);
+
+ SQL->GetData(inter->sql_handle, 1, &data, &len);
+ chemist_fame_list[i].fame = atoi(data);
+
+ SQL->GetData(inter->sql_handle, 2, &data, &len);
+ memcpy(chemist_fame_list[i].name, data, (((len) < ((23 + 1))) ? (len) : ((23 + 1))));
+ }
+
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_TAEKWON, fame_list_size_taekwon) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2743));
+ for( i = 0; i < fame_list_size_taekwon && 0 == SQL->NextRow(inter->sql_handle); ++i )
+ {
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 2747 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 2747 "../../../server-code/src/char/char.c"
+ );
+ taekwon_fame_list[i].id = atoi(data);
+
+ SQL->GetData(inter->sql_handle, 1, &data, &len);
+ taekwon_fame_list[i].fame = atoi(data);
+
+ SQL->GetData(inter->sql_handle, 2, &data, &len);
+ memcpy(taekwon_fame_list[i].name, data, (((len) < ((23 + 1))) ? (len) : ((23 + 1))));
+ }
+ SQL->FreeResult(inter->sql_handle);
+}
+
+
+int char_send_fame_list(int fd) {
+ int i, len = 8;
+ unsigned char buf[32000];
+
+ WBUFW(buf,0) = 0x2b1b;
+
+ for(i = 0; i < fame_list_size_smith && smith_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &smith_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+
+ WBUFW(buf,6) = len;
+
+ for(i = 0; i < fame_list_size_chemist && chemist_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &chemist_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+
+ WBUFW(buf,4) = len;
+
+ for(i = 0; i < fame_list_size_taekwon && taekwon_fame_list[i].id; i++) {
+ memcpy(WBUFP(buf, len), &taekwon_fame_list[i], sizeof(struct fame_list));
+ len += sizeof(struct fame_list);
+ }
+
+ WBUFW(buf,2) = len;
+
+ if (fd != -1)
+ mapif->send(fd, buf, len);
+ else
+ mapif->sendall(buf, len);
+
+ return 0;
+}
+
+void char_update_fame_list(int type, int index, int fame) {
+ unsigned char buf[8];
+ WBUFW(buf,0) = 0x2b22;
+ WBUFB(buf,2) = type;
+ WBUFB(buf,3) = index;
+ WBUFL(buf,4) = fame;
+ mapif->sendall(buf, 8);
+}
+
+
+
+int char_loadName(int char_id, char* name)
+{
+ char* data;
+ size_t len;
+
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2812));
+ else if( 0 == SQL->NextRow(inter->sql_handle) )
+ {
+ SQL->GetData(inter->sql_handle, 0, &data, &len);
+ (strlib->safestrncpy_((name),(data),((23 + 1))));
+ return 1;
+ }
+ else
+ {
+ (strlib->safestrncpy_((name),(unknown_char_name),((23 + 1))));
+ }
+ return 0;
+}
+
+
+void mapif_server_init(int id)
+{
+
+ chr->server[id].fd = -1;
+}
+
+
+void mapif_server_destroy(int id)
+{
+ if( chr->server[id].fd == -1 )
+ {
+ sockt->close(chr->server[id].fd);
+ chr->server[id].fd = -1;
+ }
+}
+
+
+
+void mapif_server_reset(int id)
+{
+ int i,j;
+ unsigned char buf[16384];
+ int fd = chr->server[id].fd;
+
+ WBUFW(buf,0) = 0x2b20;
+ WBUFL(buf,4) = htonl(chr->server[id].ip);
+ WBUFW(buf,8) = htons(chr->server[id].port);
+ j = 0;
+ for (i = 0; i < ( (chr->server[id].maps)._len_ ); i++) {
+ uint16 m = ( ( (chr->server[id].maps)._data_ )[i] );
+ if (m != 0)
+ WBUFW(buf,10+(j++)*4) = m;
+ }
+ if (j > 0) {
+ WBUFW(buf,2) = j * 4 + 10;
+ mapif->sendallwos(fd, buf, WBUFW(buf,2));
+ }
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `index`='%d'", ragsrvinfo_db, chr->server[id].fd) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2865));
+ chr->online_char_db->foreach(chr->online_char_db,chr->db_setoffline,id);
+ mapif->server_destroy(id);
+ mapif->server_init(id);
+}
+
+
+void mapif_on_disconnect(int id)
+{
+ (showmsg->showStatus(("Map-server #%d has disconnected.\n"), id));
+ mapif->server_reset(id);
+}
+
+void mapif_on_parse_accinfo(int account_id, int u_fd, int u_aid, int u_group, int map_fd) {
+ do { if (( (chr->login_fd > 0) ?
+# 2879 "../../../server-code/src/char/char.c" 3 4
+0
+# 2879 "../../../server-code/src/char/char.c"
+: (nullpo->assert_report("../../../server-code/src/char/char.c", 2879, __func__, "chr->login_fd > 0", "failed assertion"),
+# 2879 "../../../server-code/src/char/char.c" 3 4
+1
+# 2879 "../../../server-code/src/char/char.c"
+) )) return; } while(0);
+ WFIFOHEAD(chr->login_fd,22);
+ WFIFOW(chr->login_fd,0) = 0x2740;
+ WFIFOL(chr->login_fd,2) = account_id;
+ WFIFOL(chr->login_fd,6) = u_fd;
+ WFIFOL(chr->login_fd,10) = u_aid;
+ WFIFOL(chr->login_fd,14) = u_group;
+ WFIFOL(chr->login_fd,18) = map_fd;
+ WFIFOSET(chr->login_fd,22);
+}
+
+void char_parse_frommap_datasync(int fd)
+{
+ sockt->datasync(fd,
+# 2892 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 2892 "../../../server-code/src/char/char.c"
+ );
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+}
+
+void char_parse_frommap_skillid2idx(int fd)
+{
+ int i;
+ int j = RFIFOW(fd, 2) - 4;
+
+ memset(&skillid2idx, 0, sizeof(skillid2idx));
+ if( j )
+ j /= 4;
+ for(i = 0; i < j; i++) {
+ if( RFIFOW(fd, 4 + (i*4)) > 10015 ) {
+ (showmsg->showWarning(("Error skillid2dx[%d] = %d failed, %d is higher than MAX_SKILL_ID (%d)\n"),RFIFOW(fd, 4 + (i*4)), RFIFOW(fd, 6 + (i*4)),RFIFOW(fd, 4 + (i*4)),10015));
+ continue;
+ }
+ skillid2idx[RFIFOW(fd, 4 + (i*4))] = RFIFOW(fd, 6 + (i*4));
+ }
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+}
+
+void char_map_received_ok(int fd)
+{
+ WFIFOHEAD(fd, 3 + (23 + 1));
+ WFIFOW(fd,0) = 0x2afb;
+ WFIFOB(fd,2) = 0;
+ memcpy(WFIFOP(fd,3), wisp_server_name, (23 + 1));
+ WFIFOSET(fd,3+(23 + 1));
+}
+
+void char_send_maps(int fd, int id, int j)
+{
+ int k,i;
+
+ if (j == 0) {
+ (showmsg->showWarning(("Map-server %d has NO maps.\n"), id));
+ } else {
+ unsigned char buf[16384];
+
+ WBUFW(buf,0) = 0x2b04;
+ WBUFW(buf,2) = j * 4 + 10;
+ WBUFL(buf,4) = htonl(chr->server[id].ip);
+ WBUFW(buf,8) = htons(chr->server[id].port);
+ memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 4);
+ mapif->sendallwos(fd, buf, WBUFW(buf,2));
+ }
+
+ for(k = 0; k < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ); k++) {
+ if (chr->server[k].fd > 0 && k != id) {
+ WFIFOHEAD(fd,10 + 4 * ( (chr->server[k].maps)._len_ ));
+ WFIFOW(fd,0) = 0x2b04;
+ WFIFOL(fd,4) = htonl(chr->server[k].ip);
+ WFIFOW(fd,8) = htons(chr->server[k].port);
+ j = 0;
+ for(i = 0; i < ( (chr->server[k].maps)._len_ ); i++) {
+ uint16 m = ( ( (chr->server[k].maps)._data_ )[i] );
+ if (m != 0)
+ WFIFOW(fd,10+(j++)*4) = m;
+ }
+ if (j > 0) {
+ WFIFOW(fd,2) = j * 4 + 10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ }
+ }
+}
+
+void char_parse_frommap_map_names(int fd, int id)
+{
+ int i;
+
+ do { if (( (chr->server[id].maps)._max_ ) > 0) { (iMalloc->free((( (chr->server[id].maps)._data_ )),"../../../server-code/src/char/char.c", 2964, __func__)); ( (chr->server[id].maps)._data_ ) =
+# 2964 "../../../server-code/src/char/char.c" 3 4
+((void *)0)
+# 2964 "../../../server-code/src/char/char.c"
+; ( (chr->server[id].maps)._max_ ) = 0; ( (chr->server[id].maps)._len_ ) = 0; } } while(
+# 2964 "../../../server-code/src/char/char.c" 3 4
+0
+# 2964 "../../../server-code/src/char/char.c"
+);
+ do { int _empty_ = ( (chr->server[id].maps)._max_ )-( (chr->server[id].maps)._len_ ); if (((RFIFOW(fd, 2) - 4) / 4) > _empty_) { while (((RFIFOW(fd, 2) - 4) / 4) > _empty_) _empty_ += (1); do { if ((_empty_+( (chr->server[id].maps)._len_ )) > ( (chr->server[id].maps)._max_ )) { if (( (chr->server[id].maps)._max_ ) == 0) ( (chr->server[id].maps)._data_ ) = (iMalloc->malloc(((_empty_+( (chr->server[id].maps)._len_ ))*sizeof(( ( ( (chr->server[id].maps)._data_ )[0] ) ))),"../../../server-code/src/char/char.c", 2965, __func__)); else ( (chr->server[id].maps)._data_ ) = (iMalloc->realloc((( (chr->server[id].maps)._data_ )),((_empty_+( (chr->server[id].maps)._len_ ))*sizeof(( ( ( (chr->server[id].maps)._data_ )[0] ) ))),"../../../server-code/src/char/char.c", 2965, __func__)); memset(( (chr->server[id].maps)._data_ )+( (chr->server[id].maps)._len_ ), 0, (( (chr->server[id].maps)._max_ )-( (chr->server[id].maps)._len_ ))*sizeof(( ( ( (chr->server[id].maps)._data_ )[0] ) ))); ( (chr->server[id].maps)._max_ ) = (_empty_+( (chr->server[id].maps)._len_ )); } else if ((_empty_+( (chr->server[id].maps)._len_ )) == 0 && ( (chr->server[id].maps)._max_ ) > 0) { (iMalloc->free((( (chr->server[id].maps)._data_ )),"../../../server-code/src/char/char.c", 2965, __func__)); ( (chr->server[id].maps)._data_ ) =
+# 2965 "../../../server-code/src/char/char.c" 3 4
+((void *)0)
+# 2965 "../../../server-code/src/char/char.c"
+; ( (chr->server[id].maps)._max_ ) = 0; ( (chr->server[id].maps)._len_ ) = 0; } else if ((_empty_+( (chr->server[id].maps)._len_ )) < ( (chr->server[id].maps)._max_ )) { ( (chr->server[id].maps)._data_ ) = (iMalloc->realloc((( (chr->server[id].maps)._data_ )),((_empty_+( (chr->server[id].maps)._len_ ))*sizeof(( ( ( (chr->server[id].maps)._data_ )[0] ) ))),"../../../server-code/src/char/char.c", 2965, __func__)); ( (chr->server[id].maps)._max_ ) = (_empty_+( (chr->server[id].maps)._len_ )); if ((_empty_+( (chr->server[id].maps)._len_ )) - ( (chr->server[id].maps)._len_ ) > 0) ( (chr->server[id].maps)._len_ ) = (_empty_+( (chr->server[id].maps)._len_ )); } } while(
+# 2965 "../../../server-code/src/char/char.c" 3 4
+0
+# 2965 "../../../server-code/src/char/char.c"
+); } } while(
+# 2965 "../../../server-code/src/char/char.c" 3 4
+0
+# 2965 "../../../server-code/src/char/char.c"
+);
+ for (i = 4; i < RFIFOW(fd,2); i += 4) {
+ do { ( ( (chr->server[id].maps)._data_ )[( (chr->server[id].maps)._len_ )] ) = (RFIFOW(fd,i)); ++( (chr->server[id].maps)._len_ ); }while(
+# 2967 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 2967 "../../../server-code/src/char/char.c"
+ );
+ }
+
+ (showmsg->showStatus(("Map-Server %d connected: %d maps, from IP %u.%u.%u.%u port %d.\n"), id, (int)( (chr->server[id].maps)._len_ ), CONVIP(chr->server[id].ip), chr->server[id].port))
+ ;
+ (showmsg->showStatus(("Map-server %d loading complete.\n"), id));
+
+
+ chr->map_received_ok(fd);
+ chr->send_fame_list(fd);
+ chr->send_maps(fd, id, (int)( (chr->server[id].maps)._len_ ));
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+}
+
+void char_send_scdata(int fd, int aid, int cid)
+{
+
+ if( (-1) == SQL->Query(inter->sql_handle, "SELECT `type`, `tick`, `val1`, `val2`, `val3`, `val4` "
+ "FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",
+ scdata_db, aid, cid) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 2988));
+ return;
+ }
+ if( SQL->NumRows(inter->sql_handle) > 0 ) {
+ struct status_change_data scdata;
+ int count;
+ char* data;
+
+ memset(&scdata, 0, sizeof(scdata));
+ WFIFOHEAD(fd,14+50*sizeof(struct status_change_data));
+ WFIFOW(fd,0) = 0x2b1d;
+ WFIFOL(fd,4) = aid;
+ WFIFOL(fd,8) = cid;
+ for( count = 0; count < 50 && 0 == SQL->NextRow(inter->sql_handle); ++count )
+ {
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 3003 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3003 "../../../server-code/src/char/char.c"
+ ); scdata.type = atoi(data);
+ SQL->GetData(inter->sql_handle, 1, &data,
+# 3004 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3004 "../../../server-code/src/char/char.c"
+ ); scdata.tick = atoi(data);
+ SQL->GetData(inter->sql_handle, 2, &data,
+# 3005 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3005 "../../../server-code/src/char/char.c"
+ ); scdata.val1 = atoi(data);
+ SQL->GetData(inter->sql_handle, 3, &data,
+# 3006 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3006 "../../../server-code/src/char/char.c"
+ ); scdata.val2 = atoi(data);
+ SQL->GetData(inter->sql_handle, 4, &data,
+# 3007 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3007 "../../../server-code/src/char/char.c"
+ ); scdata.val3 = atoi(data);
+ SQL->GetData(inter->sql_handle, 5, &data,
+# 3008 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3008 "../../../server-code/src/char/char.c"
+ ); scdata.val4 = atoi(data);
+ memcpy(WFIFOP(fd, 14+count*sizeof(struct status_change_data)), &scdata, sizeof(struct status_change_data));
+ }
+ if (count >= 50)
+ (showmsg->showWarning(("Too many status changes for %d:%d, some of them were not loaded.\n"), aid, cid));
+ if (count > 0) {
+ WFIFOW(fd,2) = 14 + count*sizeof(struct status_change_data);
+ WFIFOW(fd,12) = count;
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", scdata_db, aid, cid) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3020));
+ }
+ } else {
+ WFIFOHEAD(fd,14);
+ WFIFOW(fd,0) = 0x2b1d;
+ WFIFOW(fd,2) = 14;
+ WFIFOL(fd,4) = aid;
+ WFIFOL(fd,8) = cid;
+ WFIFOW(fd,12) = 0;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ SQL->FreeResult(inter->sql_handle);
+
+}
+
+void char_parse_frommap_request_scdata(int fd)
+{
+
+ int aid = RFIFOL(fd,2);
+ int cid = RFIFOL(fd,6);
+ chr->send_scdata(fd, aid, cid);
+
+ RFIFOSKIP(fd, 10);
+}
+
+void char_parse_frommap_set_users_count(int fd, int id)
+{
+ if (RFIFOW(fd,2) != chr->server[id].users) {
+ chr->server[id].users = RFIFOW(fd,2);
+ (showmsg->showInfo(("User Count: %d (Server: %d)\n"), chr->server[id].users, id));
+ }
+ RFIFOSKIP(fd, 4);
+}
+
+void char_parse_frommap_set_users(int fd, int id)
+{
+
+ int i;
+
+ chr->server[id].users = RFIFOW(fd,4);
+ chr->online_char_db->foreach(chr->online_char_db,chr->db_setoffline,id);
+ for(i = 0; i < chr->server[id].users; i++) {
+ int aid = RFIFOL(fd,6+i*8);
+ int cid = RFIFOL(fd,6+i*8+4);
+ struct online_char_data *character = ( DB->data2ptr((chr->online_char_db)->ensure((chr->online_char_db),DB->i2key(aid),(chr->create_online_char_data))) );
+ if (character->server > -1 && character->server != id) {
+ (showmsg->showNotice(("Set map user: Character (%d:%d) marked on map server %d, but map server %d claims to have (%d:%d) online!\n"), character->account_id, character->char_id, character->server, id, aid, cid))
+ ;
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2);
+ }
+ character->server = id;
+ character->char_id = cid;
+ }
+
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+}
+
+void char_save_character_ack(int fd, int aid, int cid)
+{
+ WFIFOHEAD(fd,10);
+ WFIFOW(fd,0) = 0x2b21;
+ WFIFOL(fd,2) = aid;
+ WFIFOL(fd,6) = cid;
+ WFIFOSET(fd,10);
+}
+
+void char_parse_frommap_save_character(int fd, int id)
+{
+ int aid = RFIFOL(fd,4), cid = RFIFOL(fd,8), size = RFIFOW(fd,2);
+ struct online_char_data* character;
+
+ if (size - 13 != sizeof(struct mmo_charstatus)) {
+ (showmsg->showError(("parse_from_map (save-char): Size mismatch! %d != %""z" "u""\n"), size-13, sizeof(struct mmo_charstatus)));
+ RFIFOSKIP(fd,size);
+ return;
+ }
+
+ if (RFIFOB(fd,12)
+ || ( (character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->get((chr->online_char_db),DB->i2key(aid))) )) !=
+# 3098 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+
+# 3099 "../../../server-code/src/char/char.c"
+ && character->char_id == cid)
+ ) {
+ struct mmo_charstatus char_dat;
+ memcpy(&char_dat, RFIFOP(fd,13), sizeof(struct mmo_charstatus));
+ chr->mmo_char_tosql(cid, &char_dat);
+ } else {
+
+ (showmsg->showError(("parse_from_map (save-char): Received data for non-existing/offline character (%d:%d).\n"), aid, cid));
+ chr->set_char_online(id, cid, aid);
+ }
+
+ if (RFIFOB(fd,12)) {
+
+ chr->set_char_offline(cid, aid);
+ chr->save_character_ack(fd, aid, cid);
+ }
+ RFIFOSKIP(fd,size);
+}
+
+
+
+void char_select_ack(int fd, int account_id, uint8 flag)
+{
+ WFIFOHEAD(fd,7);
+ WFIFOW(fd,0) = 0x2b03;
+ WFIFOL(fd,2) = account_id;
+ WFIFOB(fd,6) = flag;
+ WFIFOSET(fd,7);
+}
+
+void char_parse_frommap_char_select_req(int fd)
+{
+ int account_id = RFIFOL(fd,2);
+ uint32 login_id1 = RFIFOL(fd,6);
+ uint32 login_id2 = RFIFOL(fd,10);
+ uint32 ip = RFIFOL(fd,14);
+ int32 group_id = RFIFOL(fd, 18);
+ RFIFOSKIP(fd,22);
+
+ if( core->runflag != CHARSERVER_ST_RUNNING )
+ {
+ chr->select_ack(fd, account_id, 0);
+ }
+ else
+ {
+ struct char_auth_node* node;
+
+
+ ((node) = (struct char_auth_node *) (iMalloc->calloc(((1)),(sizeof(struct char_auth_node)),"../../../server-code/src/char/char.c", 3147, __func__)));
+ node->account_id = account_id;
+ node->char_id = 0;
+ node->login_id1 = login_id1;
+ node->login_id2 = login_id2;
+ node->group_id = group_id;
+
+ node->ip = ntohl(ip);
+
+
+
+ ( (auth_db)->put((auth_db),DB->i2key(account_id),DB->ptr2data(node),
+# 3158 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3158 "../../../server-code/src/char/char.c"
+ ) );
+
+
+ chr->set_char_charselect(account_id);
+ chr->select_ack(fd, account_id, 1);
+ }
+}
+
+void char_change_map_server_ack(int fd, const uint8 *data,
+# 3166 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 3166 "../../../server-code/src/char/char.c"
+ ok)
+{
+ WFIFOHEAD(fd,30);
+ WFIFOW(fd,0) = 0x2b06;
+ memcpy(WFIFOP(fd,2), data, 28);
+ if (!ok)
+ WFIFOL(fd,6) = 0;
+ WFIFOSET(fd,30);
+}
+
+void char_parse_frommap_change_map_server(int fd)
+{
+ int map_id, map_fd = -1;
+ struct mmo_charstatus* char_data;
+
+ map_id = chr->search_mapserver(RFIFOW(fd,18), ntohl(RFIFOL(fd,24)), ntohs(RFIFOW(fd,28)));
+ if (map_id >= 0)
+ map_fd = chr->server[map_id].fd;
+
+ char_data = (struct mmo_charstatus*)( DB->data2ptr((chr->char_db_)->get((chr->char_db_),DB->ui2key(RFIFOL(fd,14)))) );
+ if (char_data ==
+# 3186 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3186 "../../../server-code/src/char/char.c"
+ ) {
+
+ struct mmo_charstatus char_dat;
+ chr->mmo_char_fromsql(RFIFOL(fd,14), &char_dat,
+# 3189 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 3189 "../../../server-code/src/char/char.c"
+ );
+ char_data = (struct mmo_charstatus*)( DB->data2ptr((chr->char_db_)->get((chr->char_db_),DB->ui2key(RFIFOL(fd,14)))) );
+ }
+
+ if (core->runflag == CHARSERVER_ST_RUNNING && sockt->session_is_active(map_fd) && char_data) {
+
+ struct online_char_data* data;
+ struct char_auth_node* node;
+
+
+ char_data->last_point.map = RFIFOW(fd,18);
+ char_data->last_point.x = RFIFOW(fd,20);
+ char_data->last_point.y = RFIFOW(fd,22);
+ char_data->sex = RFIFOB(fd,30);
+
+
+ ((node) = (struct char_auth_node *) (iMalloc->calloc(((1)),(sizeof(struct char_auth_node)),"../../../server-code/src/char/char.c", 3205, __func__)));
+ node->account_id = RFIFOL(fd,2);
+ node->char_id = RFIFOL(fd,14);
+ node->login_id1 = RFIFOL(fd,6);
+ node->login_id2 = RFIFOL(fd,10);
+ node->sex = RFIFOB(fd,30);
+ node->expiration_time = 0;
+ node->ip = ntohl(RFIFOL(fd,31));
+ node->group_id = RFIFOL(fd,35);
+ node->changing_mapservers = 1;
+ ( (auth_db)->put((auth_db),DB->i2key(RFIFOL(fd,2)),DB->ptr2data(node),
+# 3215 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3215 "../../../server-code/src/char/char.c"
+ ) );
+
+ data = ( DB->data2ptr((chr->online_char_db)->ensure((chr->online_char_db),DB->i2key(RFIFOL(fd,2)),(chr->create_online_char_data))) );
+ data->char_id = char_data->char_id;
+ data->server = map_id;
+
+
+ chr->change_map_server_ack(fd, RFIFOP(fd,2),
+# 3222 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 3222 "../../../server-code/src/char/char.c"
+ );
+ } else {
+ chr->change_map_server_ack(fd, RFIFOP(fd,2),
+# 3224 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 3224 "../../../server-code/src/char/char.c"
+ );
+ }
+ RFIFOSKIP(fd,39);
+}
+
+void char_parse_frommap_remove_friend(int fd)
+{
+ int char_id = RFIFOL(fd,2);
+ int friend_id = RFIFOL(fd,6);
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d' AND `friend_id`='%d' LIMIT 1",
+ friend_db, char_id, friend_id) ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3235));
+ }
+ RFIFOSKIP(fd,10);
+}
+
+void char_char_name_ack(int fd, int char_id)
+{
+ WFIFOHEAD(fd,30);
+ WFIFOW(fd,0) = 0x2b09;
+ WFIFOL(fd,2) = char_id;
+ chr->loadName(char_id, WFIFOP(fd,6));
+ WFIFOSET(fd,30);
+}
+
+void char_parse_frommap_char_name_request(int fd)
+{
+ chr->char_name_ack(fd, RFIFOL(fd,2));
+ RFIFOSKIP(fd,6);
+}
+
+void char_parse_frommap_change_email(int fd)
+{
+ if (chr->login_fd > 0) {
+ WFIFOHEAD(chr->login_fd,86);
+ memcpy(WFIFOP(chr->login_fd,0), RFIFOP(fd,0),86);
+ WFIFOW(chr->login_fd,0) = 0x2722;
+ WFIFOSET(chr->login_fd,86);
+ }
+ RFIFOSKIP(fd, 86);
+}
+
+void mapif_char_ban(int char_id, time_t timestamp)
+{
+ unsigned char buf[11];
+ WBUFW(buf,0) = 0x2b14;
+ WBUFL(buf,2) = char_id;
+ WBUFB(buf,6) = 2;
+ WBUFL(buf,7) = (unsigned int)timestamp;
+ mapif->sendall(buf, 11);
+}
+
+void char_ban(int account_id, int char_id, time_t *unban_time, short year, short month, short day, short hour, short minute, short second)
+{
+ time_t timestamp;
+ struct tm *tmtime;
+ struct SqlStmt *stmt = SQL->StmtMalloc(inter->sql_handle);
+
+ do { if (((void)(unban_time),
+# 3282 "../../../server-code/src/char/char.c" 3 4
+0
+# 3282 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+
+ if (*unban_time == 0 || *unban_time < time(
+# 3284 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3284 "../../../server-code/src/char/char.c"
+ ))
+ timestamp = time(
+# 3285 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3285 "../../../server-code/src/char/char.c"
+ );
+ else
+ timestamp = *unban_time;
+
+ tmtime = localtime(&timestamp);
+ tmtime->tm_year = tmtime->tm_year + year;
+ tmtime->tm_mon = tmtime->tm_mon + month;
+ tmtime->tm_mday = tmtime->tm_mday + day;
+ tmtime->tm_hour = tmtime->tm_hour + hour;
+ tmtime->tm_min = tmtime->tm_min + minute;
+ tmtime->tm_sec = tmtime->tm_sec + second;
+ timestamp = mktime(tmtime);
+
+ if( 0 != SQL->StmtPrepare(stmt,
+ "UPDATE `%s` SET `unban_time` = ? WHERE `char_id` = ? LIMIT 1",
+ char_db)
+ || 0 != SQL->StmtBindParam(stmt, 0, SQLDT_LONG, &timestamp, sizeof(timestamp))
+ || 0 != SQL->StmtBindParam(stmt, 1, SQLDT_INT, &char_id, sizeof(char_id))
+ || 0 != SQL->StmtExecute(stmt)
+ ) {
+ (SQL->StmtShowDebug_((stmt), "../../../server-code/src/char/char.c", 3305));
+ }
+
+ SQL->StmtFree(stmt);
+
+
+ if( timestamp > time(
+# 3311 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3311 "../../../server-code/src/char/char.c"
+ ) ) {
+ mapif->char_ban(char_id, timestamp);
+
+ chr->disconnect_player(account_id);
+ }
+}
+
+void char_unban(int char_id, int *result)
+{
+
+ if( (-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `unban_time` = '0' WHERE `char_id` = '%d' LIMIT 1", char_db, char_id) ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3322));
+ if (result)
+ *result = 1;
+ }
+}
+
+void char_ask_name_ack(int fd, int acc, const char* name, int type, int result)
+{
+ do { if (((void)(name),
+# 3330 "../../../server-code/src/char/char.c" 3 4
+0
+# 3330 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+ WFIFOHEAD(fd,34);
+ WFIFOW(fd,0) = 0x2b0f;
+ WFIFOL(fd, 2) = acc;
+ (strlib->safestrncpy_((WFIFOP(fd,6)),(name),((23 + 1))));
+ WFIFOW(fd,30) = type;
+ WFIFOW(fd,32) = result;
+ WFIFOSET(fd,34);
+}
+# 3350 "../../../server-code/src/char/char.c"
+int char_changecharsex(int char_id, int sex)
+{
+ int class_ = 0, guild_id = 0, account_id = 0;
+ char *data;
+
+
+ if ((-1) == SQL->Query(inter->sql_handle, "SELECT `account_id`,`class`,`guild_id` FROM `%s` WHERE `char_id` = '%d'", char_db, char_id)) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3357));
+ return 1;
+ }
+ if (SQL->NumRows(inter->sql_handle) != 1 || (-1) == SQL->NextRow(inter->sql_handle)) {
+ SQL->FreeResult(inter->sql_handle);
+ return 1;
+ }
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 3364 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3364 "../../../server-code/src/char/char.c"
+ ); account_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 1, &data,
+# 3365 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3365 "../../../server-code/src/char/char.c"
+ ); class_ = atoi(data);
+ SQL->GetData(inter->sql_handle, 2, &data,
+# 3366 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3366 "../../../server-code/src/char/char.c"
+ ); guild_id = atoi(data);
+ SQL->FreeResult(inter->sql_handle);
+
+ if ((-1) == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `sex` = '%c' WHERE `char_id` = '%d'", char_db, sex == SEX_MALE ? 'M' : 'F', char_id)) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3370));
+ return 1;
+ }
+ char_change_sex_sub(sex, account_id, char_id, class_, guild_id);
+
+
+ chr->disconnect_player(account_id);
+
+
+ chr->changesex(account_id, sex);
+ return 0;
+}
+
+void char_parse_frommap_change_account(int fd)
+{
+ int result = 0;
+ char esc_name[(23 + 1)*2+1];
+
+ int acc = RFIFOL(fd,2);
+ const char *name = RFIFOP(fd,6);
+ int type = RFIFOW(fd,30);
+ short year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;
+ int sex = SEX_MALE;
+ if (type == 2 || type == 6) {
+ year = RFIFOW(fd,32);
+ month = RFIFOW(fd,34);
+ day = RFIFOW(fd,36);
+ hour = RFIFOW(fd,38);
+ minute = RFIFOW(fd,40);
+ second = RFIFOW(fd,42);
+ } else if (type == 8) {
+ sex = RFIFOB(fd, 32);
+ }
+ RFIFOSKIP(fd,44);
+
+ SQL->EscapeStringLen(inter->sql_handle, esc_name, name, (strlib->strnlen_((name),((23 + 1)))));
+
+ if((-1) == SQL->Query(inter->sql_handle, "SELECT `account_id`,`char_id`,`unban_time` FROM `%s` WHERE `name` = '%s'", char_db, esc_name)) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3408));
+ } else if (SQL->NumRows(inter->sql_handle) == 0) {
+ SQL->FreeResult(inter->sql_handle);
+ result = 1;
+ } else if (0 != SQL->NextRow(inter->sql_handle)) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3413));
+ SQL->FreeResult(inter->sql_handle);
+ result = 1;
+ } else {
+ int account_id, char_id;
+ char *data;
+ time_t unban_time;
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 3421 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3421 "../../../server-code/src/char/char.c"
+ ); account_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 1, &data,
+# 3422 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3422 "../../../server-code/src/char/char.c"
+ ); char_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 2, &data,
+# 3423 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3423 "../../../server-code/src/char/char.c"
+ ); unban_time = atol(data);
+ SQL->FreeResult(inter->sql_handle);
+
+ if( chr->login_fd <= 0 ) {
+ result = 3;
+
+
+
+
+ } else {
+ switch (type) {
+ case CHAR_ASK_NAME_BLOCK:
+ loginif->block_account(account_id, 5);
+ break;
+ case CHAR_ASK_NAME_BAN:
+ loginif->ban_account(account_id, year, month, day, hour, minute, second);
+ break;
+ case CHAR_ASK_NAME_UNBLOCK:
+ loginif->block_account(account_id, 0);
+ break;
+ case CHAR_ASK_NAME_UNBAN:
+ loginif->unban_account(account_id);
+ break;
+ case CHAR_ASK_NAME_CHANGESEX:
+ loginif->changesex(account_id);
+ break;
+ case CHAR_ASK_NAME_CHARBAN:
+
+ chr->ban(account_id, char_id, &unban_time, year, month, day, hour, minute, second);
+ break;
+ case CHAR_ASK_NAME_CHARUNBAN:
+ chr->unban(char_id, &result);
+ break;
+ case CHAR_ASK_NAME_CHANGECHARSEX:
+ result = chr->changecharsex(char_id, sex);
+ break;
+ }
+ }
+ }
+
+
+ if (acc != -1 && type != CHAR_ASK_NAME_CHANGESEX && type != CHAR_ASK_NAME_CHANGECHARSEX) {
+ chr->ask_name_ack(fd, acc, name, type, result);
+ }
+}
+
+void char_parse_frommap_fame_list(int fd)
+{
+ int cid = RFIFOL(fd, 2);
+ int fame = RFIFOL(fd, 6);
+ char type = RFIFOB(fd, 10);
+ int size;
+ struct fame_list* list;
+ int player_pos;
+ int fame_pos;
+
+ switch(type) {
+ case RANKTYPE_BLACKSMITH: size = fame_list_size_smith; list = smith_fame_list; break;
+ case RANKTYPE_ALCHEMIST: size = fame_list_size_chemist; list = chemist_fame_list; break;
+ case RANKTYPE_TAEKWON: size = fame_list_size_taekwon; list = taekwon_fame_list; break;
+ default: size = 0; list =
+# 3483 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3483 "../../../server-code/src/char/char.c"
+ ; break;
+ }
+
+ if (!list) {
+ RFIFOSKIP(fd, 11);
+ return;
+ }
+ do { for ((player_pos) = (0); (player_pos) < (size); ++(player_pos)) if (list[player_pos].id == cid) break; } while(
+# 3490 "../../../server-code/src/char/char.c" 3 4
+0
+# 3490 "../../../server-code/src/char/char.c"
+);
+ do { for ((fame_pos) = (0); (fame_pos) < (size); ++(fame_pos)) if (list[fame_pos].fame <= fame) break; } while(
+# 3491 "../../../server-code/src/char/char.c" 3 4
+0
+# 3491 "../../../server-code/src/char/char.c"
+);
+
+ if( player_pos == size && fame_pos == size )
+ ;
+ else if( fame_pos == player_pos ) {
+
+ list[player_pos].fame = fame;
+ chr->update_fame_list(type, player_pos, fame);
+ } else {
+
+ if( player_pos == size ) {
+
+ do { if ((size - 1) != (fame_pos)) { struct fame_list _backup_; memmove(&_backup_, (list)+(size - 1), sizeof(struct fame_list)); if ((size - 1) < (fame_pos)) memmove((list)+(size - 1), (list)+(size - 1)+1, ((fame_pos)-(size - 1))*sizeof(struct fame_list)); else if ((size - 1) > (fame_pos)) memmove((list)+(fame_pos)+1, (list)+(fame_pos), ((size - 1)-(fame_pos))*sizeof(struct fame_list)); memmove((list)+(fame_pos), &_backup_, sizeof(struct fame_list)); } } while(
+# 3503 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 3503 "../../../server-code/src/char/char.c"
+ );
+ list[fame_pos].id = cid;
+ list[fame_pos].fame = fame;
+ chr->loadName(cid, list[fame_pos].name);
+ } else {
+
+ if( fame_pos == size )
+ --fame_pos;
+ do { if ((player_pos) != (fame_pos)) { struct fame_list _backup_; memmove(&_backup_, (list)+(player_pos), sizeof(struct fame_list)); if ((player_pos) < (fame_pos)) memmove((list)+(player_pos), (list)+(player_pos)+1, ((fame_pos)-(player_pos))*sizeof(struct fame_list)); else if ((player_pos) > (fame_pos)) memmove((list)+(fame_pos)+1, (list)+(fame_pos), ((player_pos)-(fame_pos))*sizeof(struct fame_list)); memmove((list)+(fame_pos), &_backup_, sizeof(struct fame_list)); } } while(
+# 3511 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 3511 "../../../server-code/src/char/char.c"
+ );
+ list[fame_pos].fame = fame;
+ }
+ chr->send_fame_list(-1);
+ }
+
+ RFIFOSKIP(fd,11);
+}
+
+void char_parse_frommap_divorce_char(int fd)
+{
+ chr->divorce_char_sql(RFIFOL(fd,2), RFIFOL(fd,6));
+ RFIFOSKIP(fd,10);
+}
+
+void char_parse_frommap_ragsrvinfo(int fd)
+{
+ char esc_server_name[sizeof(chr->server_name)*2+1];
+
+ SQL->EscapeString(inter->sql_handle, esc_server_name, chr->server_name);
+
+ if( (-1) == SQL->Query(inter->sql_handle, "INSERT INTO `%s` SET `index`='%d',`name`='%s',`exp`='%u',`jexp`='%u',`drop`='%u'",
+ ragsrvinfo_db, fd, esc_server_name, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3535));
+ }
+ RFIFOSKIP(fd,14);
+}
+
+void char_parse_frommap_set_char_offline(int fd)
+{
+ chr->set_char_offline(RFIFOL(fd,2),RFIFOL(fd,6));
+ RFIFOSKIP(fd,10);
+}
+
+void char_parse_frommap_set_all_offline(int fd, int id)
+{
+ chr->set_all_offline(id);
+ RFIFOSKIP(fd,2);
+}
+
+void char_parse_frommap_set_char_online(int fd, int id)
+{
+ chr->set_char_online(id, RFIFOL(fd,2),RFIFOL(fd,6));
+ RFIFOSKIP(fd,10);
+}
+
+void char_parse_frommap_build_fame_list(int fd)
+{
+ chr->read_fame_list();
+ chr->send_fame_list(-1);
+ RFIFOSKIP(fd,2);
+}
+
+void char_parse_frommap_save_status_change_data(int fd)
+{
+
+ int aid = RFIFOL(fd, 4);
+ int cid = RFIFOL(fd, 8);
+ int count = RFIFOW(fd, 12);
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", scdata_db, aid, cid) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3574));
+
+ if( count > 0 )
+ {
+ struct status_change_data data;
+ StringBuf buf;
+ int i;
+
+ StrBuf->Init(&buf);
+ StrBuf->Printf(&buf, "INSERT INTO `%s` (`account_id`, `char_id`, `type`, `tick`, `val1`, `val2`, `val3`, `val4`) VALUES ", scdata_db);
+ for( i = 0; i < count; ++i )
+ {
+ memcpy (&data, RFIFOP(fd, 14+i*sizeof(struct status_change_data)), sizeof(struct status_change_data));
+ if( i > 0 )
+ StrBuf->AppendStr(&buf, ", ");
+ StrBuf->Printf(&buf, "('%d','%d','%hu','%d','%d','%d','%d','%d')", aid, cid,
+ data.type, data.tick, data.val1, data.val2, data.val3, data.val4);
+ }
+ if( (-1) == SQL->QueryStr(inter->sql_handle, StrBuf->Value(&buf)) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3593));
+ StrBuf->Destroy(&buf);
+ }
+
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+}
+
+void char_send_pong(int fd)
+{
+ WFIFOHEAD(fd,2);
+ WFIFOW(fd,0) = 0x2b24;
+ WFIFOSET(fd,2);
+}
+
+void char_parse_frommap_ping(int fd)
+{
+ chr->send_pong(fd);
+ RFIFOSKIP(fd,2);
+}
+
+void char_map_auth_ok(int fd, int account_id, struct char_auth_node* node, struct mmo_charstatus* cd)
+{
+ do { if (((void)(cd),
+# 3615 "../../../server-code/src/char/char.c" 3 4
+0
+# 3615 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+ WFIFOHEAD(fd,25 + sizeof(struct mmo_charstatus));
+ WFIFOW(fd,0) = 0x2afd;
+ WFIFOW(fd,2) = 25 + sizeof(struct mmo_charstatus);
+ WFIFOL(fd,4) = account_id;
+ if (node)
+ {
+ WFIFOL(fd,8) = node->login_id1;
+ WFIFOL(fd,12) = node->login_id2;
+ WFIFOL(fd,16) = (uint32)node->expiration_time;
+ WFIFOL(fd,20) = node->group_id;
+ WFIFOB(fd,24) = node->changing_mapservers;
+ }
+ else
+ {
+ WFIFOL(fd,8) = 0;
+ WFIFOL(fd,12) = 0;
+ WFIFOL(fd,16) = 0;
+ WFIFOL(fd,20) = 0;
+ WFIFOB(fd,24) = 0;
+ }
+ memcpy(WFIFOP(fd,25), cd, sizeof(struct mmo_charstatus));
+ WFIFOSET(fd, WFIFOW(fd,2));
+}
+
+void char_map_auth_failed(int fd, int account_id, int char_id, int login_id1, char sex, uint32 ip)
+{
+ WFIFOHEAD(fd,19);
+ WFIFOW(fd,0) = 0x2b27;
+ WFIFOL(fd,2) = account_id;
+ WFIFOL(fd,6) = char_id;
+ WFIFOL(fd,10) = login_id1;
+ WFIFOB(fd,14) = sex;
+ WFIFOL(fd,15) = htonl(ip);
+ WFIFOSET(fd,19);
+}
+
+void char_parse_frommap_auth_request(int fd, int id)
+{
+ struct mmo_charstatus char_dat;
+ struct char_auth_node* node;
+ struct mmo_charstatus* cd;
+
+ int account_id = RFIFOL(fd,2);
+ int char_id = RFIFOL(fd,6);
+ int login_id1 = RFIFOL(fd,10);
+ char sex = RFIFOB(fd,14);
+ uint32 ip = ntohl(RFIFOL(fd,15));
+ char standalone = RFIFOB(fd, 19);
+ RFIFOSKIP(fd,20);
+
+ node = (struct char_auth_node*)( DB->data2ptr((auth_db)->get((auth_db),DB->i2key(account_id))) );
+ cd = (struct mmo_charstatus*)( DB->data2ptr((chr->char_db_)->get((chr->char_db_),DB->ui2key(char_id))) );
+
+ if( cd ==
+# 3669 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3669 "../../../server-code/src/char/char.c"
+ ) {
+ chr->mmo_char_fromsql(char_id, &char_dat,
+# 3670 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 3670 "../../../server-code/src/char/char.c"
+ );
+ cd = (struct mmo_charstatus*)( DB->data2ptr((chr->char_db_)->get((chr->char_db_),DB->ui2key(char_id))) );
+ }
+
+ if( core->runflag == CHARSERVER_ST_RUNNING && cd && standalone ) {
+ cd->sex = sex;
+
+ chr->map_auth_ok(fd, account_id,
+# 3677 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3677 "../../../server-code/src/char/char.c"
+ , cd);
+ chr->set_char_online(id, char_id, account_id);
+ return;
+ }
+
+ if( core->runflag == CHARSERVER_ST_RUNNING &&
+ cd !=
+# 3683 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3683 "../../../server-code/src/char/char.c"
+ &&
+ node !=
+# 3684 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3684 "../../../server-code/src/char/char.c"
+ &&
+ node->account_id == account_id &&
+ node->char_id == char_id &&
+ node->login_id1 == login_id1
+
+ )
+ {
+ if( cd->sex == 99 )
+ cd->sex = sex;
+
+ chr->map_auth_ok(fd, account_id, node, cd);
+
+ ( (auth_db)->remove((auth_db),DB->i2key(account_id),
+# 3696 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 3696 "../../../server-code/src/char/char.c"
+ ) );
+ chr->set_char_online(id, char_id, account_id);
+ }
+ else
+ {
+ chr->map_auth_failed(fd, account_id, char_id, login_id1, sex, ip);
+ }
+}
+
+void char_parse_frommap_update_ip(int fd, int id)
+{
+ chr->server[id].ip = ntohl(RFIFOL(fd, 2));
+ (showmsg->showInfo(("Updated IP address of map-server #%d to %u.%u.%u.%u.\n"), id, CONVIP(chr->server[id].ip)));
+ RFIFOSKIP(fd,6);
+}
+
+void char_parse_frommap_request_stats_report(int fd)
+{
+ int sfd;
+ struct hSockOpt opt;
+ RFIFOSKIP(fd, 2);
+
+ opt.silent = 1;
+ opt.setTimeo = 1;
+
+ if ((sfd = sockt->make_connection(sockt->host2ip("stats.herc.ws"),(uint16)25427,&opt) ) == -1) {
+ RFIFOSKIP(fd, RFIFOW(fd,2) );
+ RFIFOFLUSH(fd);
+ return;
+ }
+
+ sockt->session[sfd]->flag.server = 1;
+ sockt->realloc_fifo(sfd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+
+ WFIFOHEAD(sfd, RFIFOW(fd,2) );
+
+ memcpy(WFIFOP(sfd,0), RFIFOP(fd, 0), RFIFOW(fd,2));
+
+ WFIFOSET(sfd, RFIFOW(fd,2) );
+
+ do {
+ sockt->flush(sfd);
+ sleep(1);
+ } while( !sockt->session[sfd]->flag.eof && sockt->session[sfd]->wdata_size );
+
+ sockt->close(sfd);
+
+ RFIFOSKIP(fd, RFIFOW(fd,2) );
+ RFIFOFLUSH(fd);
+}
+
+void char_parse_frommap_scdata_update(int fd)
+{
+ int account_id = RFIFOL(fd, 2);
+ int char_id = RFIFOL(fd, 6);
+ int val1 = RFIFOL(fd, 12);
+ int val2 = RFIFOL(fd, 16);
+ int val3 = RFIFOL(fd, 20);
+ int val4 = RFIFOL(fd, 24);
+ short type = RFIFOW(fd, 10);
+
+ if ((-1) == SQL->Query(inter->sql_handle, "REPLACE INTO `%s`"
+ " (`account_id`,`char_id`,`type`,`tick`,`val1`,`val2`,`val3`,`val4`)"
+ " VALUES ('%d','%d','%d','%d','%d','%d','%d','%d')",
+ scdata_db, account_id, char_id, type, (-1), val1, val2, val3, val4)
+ ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3762));
+ }
+ RFIFOSKIP(fd, 28);
+}
+
+void char_parse_frommap_scdata_delete(int fd)
+{
+ int account_id = RFIFOL(fd, 2);
+ int char_id = RFIFOL(fd, 6);
+ short type = RFIFOW(fd, 10);
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id` = '%d' AND `type` = '%d' LIMIT 1",
+ scdata_db, account_id, char_id, type) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 3776));
+ }
+ RFIFOSKIP(fd, 12);
+}
+
+int char_parse_frommap(int fd)
+{
+ int id;
+
+ do { for ((id) = (0); (id) < (( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) )); ++(id)) if (chr->server[id].fd == fd) break; } while(
+# 3785 "../../../server-code/src/char/char.c" 3 4
+0
+# 3785 "../../../server-code/src/char/char.c"
+);
+ if( id == ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ) ) {
+ (showmsg->showDebug(("chr->parse_frommap: Disconnecting invalid session #%d (is not a map-server)\n"), fd));
+ sockt->close(fd);
+ return 0;
+ }
+ if( sockt->session[fd]->flag.eof ) {
+ sockt->close(fd);
+ chr->server[id].fd = -1;
+ mapif->on_disconnect(id);
+ return 0;
+ }
+
+ while (RFIFOREST(fd) >= 2) {
+ int packet_id = RFIFOW(fd,0);
+ if (( (HPM->packets[hpParse_FromMap])._len_ ) > 0) {
+ int result = HPM->parse_packets(fd,packet_id,hpParse_FromMap);
+ if (result == 1)
+ continue;
+ if (result == 2)
+ return 0;
+ }
+
+ switch (packet_id) {
+ case 0x2b0a:
+ if( RFIFOREST(fd) < RFIFOW(fd, 2) )
+ return 0;
+ chr->parse_frommap_datasync(fd);
+ break;
+
+ case 0x2b0b:
+ if( RFIFOREST(fd) < RFIFOW(fd, 2) )
+ return 0;
+ chr->parse_frommap_skillid2idx(fd);
+ break;
+ case 0x2afa:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ chr->parse_frommap_map_names(fd, id);
+ break;
+
+ case 0x2afc:
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ chr->parse_frommap_request_scdata(fd);
+ }
+ break;
+
+ case 0x2afe:
+ if (RFIFOREST(fd) < 4)
+ return 0;
+ chr->parse_frommap_set_users_count(fd, id);
+ break;
+
+ case 0x2aff:
+ if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ chr->parse_frommap_set_users(fd, id);
+ }
+ break;
+
+ case 0x2b01:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ chr->parse_frommap_save_character(fd, id);
+
+ }
+ break;
+
+ case 0x2b02:
+ if( RFIFOREST(fd) < 22 )
+ return 0;
+ {
+ chr->parse_frommap_char_select_req(fd);
+ }
+ break;
+
+ case 0x2b05:
+ if (RFIFOREST(fd) < 39)
+ return 0;
+ {
+ chr->parse_frommap_change_map_server(fd);
+ }
+ break;
+
+ case 0x2b07:
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ {
+ chr->parse_frommap_remove_friend(fd);
+ }
+ break;
+
+ case 0x2b08:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+
+ chr->parse_frommap_char_name_request(fd);
+ break;
+
+ case 0x2b0c:
+ if (RFIFOREST(fd) < 86)
+ return 0;
+ chr->parse_frommap_change_email(fd);
+ break;
+
+ case 0x2b0e:
+ if (RFIFOREST(fd) < 44)
+ return 0;
+ {
+ chr->parse_frommap_change_account(fd);
+ }
+ break;
+
+ case 0x2b10:
+ if (RFIFOREST(fd) < 11)
+ return 0;
+ {
+ chr->parse_frommap_fame_list(fd);
+ }
+ break;
+
+
+ case 0x2b11:
+ if( RFIFOREST(fd) < 10 )
+ return 0;
+
+ chr->parse_frommap_divorce_char(fd);
+ break;
+
+ case 0x2b16:
+ if( RFIFOREST(fd) < 14 )
+ return 0;
+ {
+ chr->parse_frommap_ragsrvinfo(fd);
+ }
+ break;
+
+ case 0x2b17:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ chr->parse_frommap_set_char_offline(fd);
+ break;
+
+ case 0x2b18:
+ chr->parse_frommap_set_all_offline(fd, id);
+ break;
+
+ case 0x2b19:
+ if (RFIFOREST(fd) < 10)
+ return 0;
+ chr->parse_frommap_set_char_online(fd, id);
+ break;
+
+ case 0x2b1a:
+ if (RFIFOREST(fd) < 2)
+ return 0;
+ chr->parse_frommap_build_fame_list(fd);
+ break;
+
+ case 0x2b1c:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ chr->parse_frommap_save_status_change_data(fd);
+ }
+ break;
+
+ case 0x2b23:
+ chr->parse_frommap_ping(fd);
+ break;
+
+ case 0x2b26:
+ if (RFIFOREST(fd) < 20)
+ return 0;
+
+ {
+ chr->parse_frommap_auth_request(fd, id);
+ }
+ break;
+
+ case 0x2736:
+ if (RFIFOREST(fd) < 6) return 0;
+ chr->parse_frommap_update_ip(fd, id);
+ break;
+
+ case 0x3008:
+ if( RFIFOREST(fd) < RFIFOW(fd,4) )
+ return 0;
+ else {
+ chr->parse_frommap_request_stats_report(fd);
+ }
+ break;
+
+
+ case 0x2740:
+ if( RFIFOREST(fd) < 28 )
+ return 0;
+ else {
+ chr->parse_frommap_scdata_update(fd);
+ }
+ break;
+
+
+ case 0x2741:
+ if( RFIFOREST(fd) < 12 )
+ return 0;
+ else {
+ chr->parse_frommap_scdata_delete(fd);
+ }
+ break;
+
+ default:
+ {
+
+ int r = inter->parse_frommap(fd);
+ if (r == 1) break;
+ if (r == 2) return 0;
+
+
+ (showmsg->showError(("Unknown packet 0x%04x from map server, disconnecting.\n"), RFIFOW(fd,0)));
+ sockt->eof(fd);
+ return 0;
+ }
+ }
+ }
+
+ return 0;
+}
+
+void do_init_mapif(void)
+{
+ int i;
+ for( i = 0; i < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ); ++i )
+ mapif->server_init(i);
+}
+
+void do_final_mapif(void)
+{
+ int i;
+ for( i = 0; i < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ); ++i )
+ mapif->server_destroy(i);
+}
+
+
+
+int char_search_mapserver(unsigned short map, uint32 ip, uint16 port)
+{
+ int i, j;
+
+ for(i = 0; i < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ); i++)
+ {
+ if (chr->server[i].fd > 0
+ && (ip == (uint32)-1 || chr->server[i].ip == ip)
+ && (port == (uint16)-1 || chr->server[i].port == port)
+ ) {
+ do { for ((j) = (0); (j) < (( (chr->server[i].maps)._len_ )); ++(j)) if (( ( (chr->server[i].maps)._data_ )[j] ) == map) break; } while(
+# 4044 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 4044 "../../../server-code/src/char/char.c"
+ );
+ if (j != ( (chr->server[i].maps)._len_ ))
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+
+static int char_mapif_init(int fd)
+{
+ return inter->mapif_init(fd);
+}
+# 4066 "../../../server-code/src/char/char.c"
+uint32 char_lan_subnet_check(uint32 ip)
+{
+ struct s_subnet lan = {0};
+ if (sockt->lan_subnet_check(ip, &lan)) {
+ (showmsg->showInfo(("Subnet check [%u.%u.%u.%u]: Matches ""\033[1;36m""%u.%u.%u.%u/%u.%u.%u.%u""\033[0m""\n"), CONVIP(ip), CONVIP(lan.ip & lan.mask), CONVIP(lan.mask)));
+ return lan.ip;
+ }
+ (showmsg->showInfo(("Subnet check [%u.%u.%u.%u]: ""\033[1;36m""WAN""\033[0m""\n"), CONVIP(ip)));
+ return 0;
+}
+# 4086 "../../../server-code/src/char/char.c"
+void char_delete2_ack(int fd, int char_id, uint32 result, time_t delete_date)
+{
+ WFIFOHEAD(fd,14);
+ WFIFOW(fd,0) = 0x828;
+ WFIFOL(fd,2) = char_id;
+ WFIFOL(fd,6) = result;
+
+ WFIFOL(fd,10) = (int)(delete_date - time(
+# 4093 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4093 "../../../server-code/src/char/char.c"
+ ));
+
+
+
+
+ WFIFOSET(fd,14);
+}
+
+void char_delete2_accept_actual_ack(int fd, int char_id, uint32 result)
+{
+ WFIFOHEAD(fd,10);
+ WFIFOW(fd,0) = 0x82a;
+ WFIFOL(fd,2) = char_id;
+ WFIFOL(fd,6) = result;
+ WFIFOSET(fd,10);
+}
+# 4118 "../../../server-code/src/char/char.c"
+void char_delete2_accept_ack(int fd, int char_id, uint32 result)
+{
+
+ if( result == 1 ) {
+ struct char_session_data* sd = (struct char_session_data*)sockt->session[fd]->session_data;
+ chr->mmo_char_send099d(fd, sd);
+ }
+
+ chr->delete2_accept_actual_ack(fd, char_id, result);
+}
+
+
+
+
+
+void char_delete2_cancel_ack(int fd, int char_id, uint32 result)
+{
+ WFIFOHEAD(fd,10);
+ WFIFOW(fd,0) = 0x82c;
+ WFIFOL(fd,2) = char_id;
+ WFIFOL(fd,6) = result;
+ WFIFOSET(fd,10);
+}
+
+static void char_delete2_req(int fd, struct char_session_data* sd)
+{
+ int char_id, i;
+ char* data;
+ time_t delete_date;
+
+ char_id = RFIFOL(fd,2);
+ do { if (((void)(sd),
+# 4149 "../../../server-code/src/char/char.c" 3 4
+0
+# 4149 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+
+ do { for ((i) = (0); (i) < (9); ++(i)) if (sd->found_char[i] == char_id) break; } while(
+# 4151 "../../../server-code/src/char/char.c" 3 4
+0
+# 4151 "../../../server-code/src/char/char.c"
+);
+ if( i == 9 )
+ {
+ chr->delete2_ack(fd, char_id, 3, 0);
+ return;
+ }
+
+ if( 0 != SQL->Query(inter->sql_handle, "SELECT `delete_date` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) || 0 != SQL->NextRow(inter->sql_handle) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 4160));
+ chr->delete2_ack(fd, char_id, 3, 0);
+ return;
+ }
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 4165 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4165 "../../../server-code/src/char/char.c"
+ ); delete_date = strtoul(data,
+# 4165 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4165 "../../../server-code/src/char/char.c"
+ , 10);
+
+ if( delete_date ) {
+ chr->delete2_ack(fd, char_id, 0, 0);
+ return;
+ }
+
+
+
+
+ if (char_aegis_delete) {
+ int party_id = 0, guild_id = 0;
+ if( 0 != SQL->Query(inter->sql_handle, "SELECT `party_id`, `guild_id` FROM `%s` WHERE `char_id`='%d'", char_db, char_id)
+ || 0 != SQL->NextRow(inter->sql_handle)
+ ) {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 4180));
+ chr->delete2_ack(fd, char_id, 3, 0);
+ return;
+ }
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 4184 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4184 "../../../server-code/src/char/char.c"
+ ); party_id = atoi(data);
+ SQL->GetData(inter->sql_handle, 1, &data,
+# 4185 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4185 "../../../server-code/src/char/char.c"
+ ); guild_id = atoi(data);
+
+ if( guild_id )
+ {
+ chr->delete2_ack(fd, char_id, 4, 0);
+ return;
+ }
+
+ if( party_id )
+ {
+ chr->delete2_ack(fd, char_id, 5, 0);
+ return;
+ }
+ }
+
+
+ delete_date = time(
+# 4201 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4201 "../../../server-code/src/char/char.c"
+ )+char_del_delay;
+
+ if( 0 != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `delete_date`='%lu' WHERE `char_id`='%d'", char_db, (unsigned long)delete_date, char_id) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 4205));
+ chr->delete2_ack(fd, char_id, 3, 0);
+ return;
+ }
+
+ chr->delete2_ack(fd, char_id, 1, delete_date);
+}
+
+static void char_delete2_accept(int fd, struct char_session_data* sd)
+{
+ char birthdate[8+1];
+ int char_id, i;
+ unsigned int base_level;
+ char* data;
+ time_t delete_date;
+
+ do { if (((void)(sd),
+# 4221 "../../../server-code/src/char/char.c" 3 4
+0
+# 4221 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+ char_id = RFIFOL(fd,2);
+
+ (showmsg->showInfo(("\033[1;31m""Request Char Deletion: ""\033[1;32m""%d (%d)""\033[0m""\n"), sd->account_id, char_id));
+
+
+ birthdate[0] = RFIFOB(fd,6);
+ birthdate[1] = RFIFOB(fd,7);
+ birthdate[2] = '-';
+ birthdate[3] = RFIFOB(fd,8);
+ birthdate[4] = RFIFOB(fd,9);
+ birthdate[5] = '-';
+ birthdate[6] = RFIFOB(fd,10);
+ birthdate[7] = RFIFOB(fd,11);
+ birthdate[8] = 0;
+
+ do { for ((i) = (0); (i) < (9); ++(i)) if (sd->found_char[i] == char_id) break; } while(
+# 4237 "../../../server-code/src/char/char.c" 3 4
+0
+# 4237 "../../../server-code/src/char/char.c"
+);
+ if( i == 9 )
+ {
+ chr->delete2_accept_ack(fd, char_id, 3);
+ return;
+ }
+
+ if( 0 != SQL->Query(inter->sql_handle, "SELECT `base_level`,`delete_date` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) || 0 != SQL->NextRow(inter->sql_handle) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 4246));
+ chr->delete2_accept_ack(fd, char_id, 3);
+ return;
+ }
+
+ SQL->GetData(inter->sql_handle, 0, &data,
+# 4251 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4251 "../../../server-code/src/char/char.c"
+ ); base_level = (unsigned int)strtoul(data,
+# 4251 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4251 "../../../server-code/src/char/char.c"
+ , 10);
+ SQL->GetData(inter->sql_handle, 1, &data,
+# 4252 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4252 "../../../server-code/src/char/char.c"
+ ); delete_date = strtoul(data,
+# 4252 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4252 "../../../server-code/src/char/char.c"
+ , 10);
+
+ if( !delete_date || delete_date>time(
+# 4254 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4254 "../../../server-code/src/char/char.c"
+ ) )
+ {
+ chr->delete2_accept_ack(fd, char_id, 4);
+ return;
+ }
+
+ if( strcmp(sd->birthdate+2, birthdate) )
+ {
+ chr->delete2_accept_ack(fd, char_id, 5);
+ return;
+ }
+
+ if( ( char_del_level > 0 && base_level >= (unsigned int)char_del_level ) || ( char_del_level < 0 && base_level <= (unsigned int)(-char_del_level) ) )
+ {
+ chr->delete2_accept_ack(fd, char_id, 2);
+ return;
+ }
+
+
+ if( chr->delete_char_sql(char_id) < 0 )
+ {
+ chr->delete2_accept_ack(fd, char_id, 3);
+ return;
+ }
+
+
+ sd->found_char[i] = -1;
+
+ chr->delete2_accept_ack(fd, char_id, 1);
+}
+
+static void char_delete2_cancel(int fd, struct char_session_data* sd)
+{
+ int char_id, i;
+
+ do { if (((void)(sd),
+# 4289 "../../../server-code/src/char/char.c" 3 4
+0
+# 4289 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+ char_id = RFIFOL(fd,2);
+
+ do { for ((i) = (0); (i) < (9); ++(i)) if (sd->found_char[i] == char_id) break; } while(
+# 4292 "../../../server-code/src/char/char.c" 3 4
+0
+# 4292 "../../../server-code/src/char/char.c"
+);
+ if( i == 9 )
+ {
+ chr->delete2_cancel_ack(fd, char_id, 2);
+ return;
+ }
+
+
+
+
+ if( 0 != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `delete_date`='0' WHERE `char_id`='%d'", char_db, char_id) )
+ {
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 4304));
+ chr->delete2_cancel_ack(fd, char_id, 2);
+ return;
+ }
+
+ chr->delete2_cancel_ack(fd, char_id, 1);
+}
+
+void char_send_account_id(int fd, int account_id)
+{
+ WFIFOHEAD(fd,4);
+ WFIFOL(fd,0) = account_id;
+ WFIFOSET(fd,4);
+}
+
+void char_parse_char_connect(int fd, struct char_session_data* sd, uint32 ipl)
+{
+ int account_id = RFIFOL(fd,2);
+ uint32 login_id1 = RFIFOL(fd,6);
+ uint32 login_id2 = RFIFOL(fd,10);
+ int sex = RFIFOB(fd,16);
+ struct char_auth_node* node;
+
+ RFIFOSKIP(fd,17);
+
+ (showmsg->showInfo(("request connect - account_id:%d/login_id1:%u/login_id2:%u\n"), account_id, login_id1, login_id2));
+
+ if (sd) {
+
+
+
+ return;
+ }
+
+ ((sockt->session[fd]->session_data) = (struct char_session_data *) (iMalloc->calloc(((1)),(sizeof(struct char_session_data)),"../../../server-code/src/char/char.c", 4338, __func__)));
+ sd = (struct char_session_data*)sockt->session[fd]->session_data;
+ sd->account_id = account_id;
+ sd->login_id1 = login_id1;
+ sd->login_id2 = login_id2;
+ sd->sex = sex;
+ sd->auth =
+# 4344 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 4344 "../../../server-code/src/char/char.c"
+ ;
+
+
+ chr->send_account_id(fd, account_id);
+
+ if( core->runflag != CHARSERVER_ST_RUNNING ) {
+ chr->auth_error(fd, 0);
+ return;
+ }
+
+
+ node = (struct char_auth_node*)( DB->data2ptr((auth_db)->get((auth_db),DB->i2key(account_id))) );
+ if( node !=
+# 4356 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4356 "../../../server-code/src/char/char.c"
+ &&
+ node->account_id == account_id &&
+ node->login_id1 == login_id1 &&
+ node->login_id2 == login_id2
+ )
+ {
+
+ if( chr->server_type == CST_MAINTENANCE && node->group_id < char_maintenance_min_group_id ) {
+ chr->auth_error(fd, 0);
+ return;
+ }
+
+ if( chr->server_type == CST_PAYING && (time_t)node->expiration_time < time(
+# 4368 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4368 "../../../server-code/src/char/char.c"
+ ) ) {
+ chr->auth_error(fd, 0);
+ return;
+ }
+ ( (auth_db)->remove((auth_db),DB->i2key(account_id),
+# 4372 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4372 "../../../server-code/src/char/char.c"
+ ) );
+ chr->auth_ok(fd, sd);
+ }
+ else
+ {
+ if (chr->login_fd > 0) {
+ loginif->auth(fd, sd, ipl);
+ } else {
+ chr->auth_error(fd, 0);
+ }
+ }
+}
+
+void char_send_map_info(int fd, int i, uint32 subnet_map_ip, struct mmo_charstatus *cd)
+{
+ do { if (((void)(cd),
+# 4387 "../../../server-code/src/char/char.c" 3 4
+0
+# 4387 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+ WFIFOHEAD(fd,28);
+ WFIFOW(fd,0) = 0x71;
+ WFIFOL(fd,2) = cd->char_id;
+ mapindex->getmapname_ext(mapindex->id2name((cd->last_point.map),"../../../server-code/src/char/char.c", 4391, __func__), WFIFOP(fd,6));
+ WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : chr->server[i].ip);
+ WFIFOW(fd,26) = sockt->ntows(htons(chr->server[i].port));
+ WFIFOSET(fd,28);
+}
+
+void char_send_wait_char_server(int fd)
+{
+ WFIFOHEAD(fd, 24);
+ WFIFOW(fd,0) = 0x840;
+ WFIFOW(fd,2) = 24;
+ (strlib->safestrncpy_((WFIFOP(fd,4)),("0"),(20)));
+ WFIFOSET(fd, 24);
+}
+
+int char_search_default_maps_mapserver(struct mmo_charstatus *cd)
+{
+ int i;
+ int j;
+ do { if (((void)(cd),
+# 4410 "../../../server-code/src/char/char.c" 3 4
+0
+# 4410 "../../../server-code/src/char/char.c"
+)) return(-1); } while(0);
+ if ((i = chr->search_mapserver((j=mapindex->name2id("prontera")),-1,-1)) >= 0) {
+ cd->last_point.x = 273;
+ cd->last_point.y = 354;
+ } else if ((i = chr->search_mapserver((j=mapindex->name2id("geffen")),-1,-1)) >= 0) {
+ cd->last_point.x = 120;
+ cd->last_point.y = 100;
+ } else if ((i = chr->search_mapserver((j=mapindex->name2id("morocc")),-1,-1)) >= 0) {
+ cd->last_point.x = 160;
+ cd->last_point.y = 94;
+ } else if ((i = chr->search_mapserver((j=mapindex->name2id("alberta")),-1,-1)) >= 0) {
+ cd->last_point.x = 116;
+ cd->last_point.y = 57;
+ } else if ((i = chr->search_mapserver((j=mapindex->name2id("payon")),-1,-1)) >= 0) {
+ cd->last_point.x = 87;
+ cd->last_point.y = 117;
+ } else if ((i = chr->search_mapserver((j=mapindex->name2id("izlude")),-1,-1)) >= 0) {
+ cd->last_point.x = 94;
+ cd->last_point.y = 103;
+ }
+ if (i >= 0)
+ {
+ cd->last_point.map = j;
+ (showmsg->showWarning(("Unable to find map-server for '%s', sending to major city '%s'.\n"), mapindex->id2name((cd->last_point.map),"../../../server-code/src/char/char.c", 4433, __func__), mapindex->id2name((j),"../../../server-code/src/char/char.c", 4433, __func__)));
+ }
+ return i;
+}
+
+void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl) __attribute__((nonnull (2)));
+void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl)
+{
+ struct mmo_charstatus char_dat;
+ struct mmo_charstatus *cd;
+ struct char_auth_node* node;
+ char* data;
+ int char_id;
+ int server_id = 0;
+ int i;
+ int map_fd;
+ uint32 subnet_map_ip;
+ int slot = RFIFOB(fd,2);
+
+ RFIFOSKIP(fd,3);
+
+
+ if( pincode->enabled ){
+ struct online_char_data* character;
+ character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->get((chr->online_char_db),DB->i2key(sd->account_id))) );
+ if( character && character->pincode_enable == -1){
+ chr->auth_error(fd, 0);
+ return;
+ }
+ }
+
+
+ do { for ((server_id) = (0); (server_id) < (( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) )); ++(server_id)) if (chr->server[server_id].fd > 0 && ( (chr->server[server_id].maps)._len_ ) > 0) break; } while(
+# 4465 "../../../server-code/src/char/char.c" 3 4
+0
+# 4465 "../../../server-code/src/char/char.c"
+);
+
+
+ if( server_id == ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ) ) {
+ chr->send_wait_char_server(fd);
+ return;
+ }
+
+ if (0 != SQL->Query(inter->sql_handle, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'", char_db, sd->account_id, slot)
+ || 0 != SQL->NextRow(inter->sql_handle)
+ || 0 != SQL->GetData(inter->sql_handle, 0, &data,
+# 4475 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4475 "../../../server-code/src/char/char.c"
+ )
+ ) {
+
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 4478));
+ SQL->FreeResult(inter->sql_handle);
+ chr->auth_error(fd, 0);
+ return;
+ }
+
+ char_id = atoi(data);
+ SQL->FreeResult(inter->sql_handle);
+
+
+ if( sd->found_char[slot] == char_id && sd->unban_time[slot] > time(
+# 4488 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4488 "../../../server-code/src/char/char.c"
+ ) ) {
+ chr->auth_error(fd, 0);
+ return;
+ }
+
+
+ chr->set_char_online(-2,char_id,sd->account_id);
+ if( !chr->mmo_char_fromsql(char_id, &char_dat,
+# 4495 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 4495 "../../../server-code/src/char/char.c"
+ ) ) {
+ chr->set_char_offline(char_id, sd->account_id);
+
+ chr->auth_error(fd, 0);
+ return;
+ }
+
+
+ cd = (struct mmo_charstatus *)( DB->data2ptr((chr->char_db_)->get((chr->char_db_),DB->i2key(char_id))) );
+ do { if (((void)(cd),
+# 4504 "../../../server-code/src/char/char.c" 3 4
+0
+# 4504 "../../../server-code/src/char/char.c"
+)) return; } while(0);
+ if( cd->sex == 99 )
+ cd->sex = sd->sex;
+
+ if (log_char) {
+ char esc_name[(23 + 1)*2+1];
+
+ SQL->EscapeStringLen(inter->sql_handle, esc_name, char_dat.name, (strlib->strnlen_((char_dat.name),((23 + 1)))));
+ if( (-1) == SQL->Query(inter->sql_handle,
+ "INSERT INTO `%s`(`time`, `account_id`, `char_id`, `char_num`, `name`) VALUES (NOW(), '%d', '%d', '%d', '%s')",
+ charlog_db, sd->account_id, cd->char_id, slot, esc_name) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 4515));
+ }
+ (showmsg->showInfo(("Selected char: (Account %d: %d - %s)\n"), sd->account_id, slot, char_dat.name));
+
+
+ i = chr->search_mapserver(cd->last_point.map, -1, -1);
+
+
+ if (i < 0 || !cd->last_point.map) {
+ unsigned short j;
+
+ do { for ((j) = (0); (j) < (( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) )); ++(j)) if (chr->server[j].fd >= 0 && ( (chr->server[j].maps)._len_ ) > 0) break; } while(
+# 4526 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 4526 "../../../server-code/src/char/char.c"
+ );
+ if (j == ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) )) {
+ (showmsg->showInfo(("Connection Closed. No map servers available.\n")));
+ chr->authfail_fd(fd, 1);
+ return;
+ }
+ i = chr->search_default_maps_mapserver(cd);
+ if (i < 0)
+ {
+ (showmsg->showInfo(("Connection Closed. No map server available that has a major city, and unable to find map-server for '%s'.\n"), mapindex->id2name((cd->last_point.map),"../../../server-code/src/char/char.c", 4535, __func__)));
+ chr->authfail_fd(fd, 1);
+ return;
+ }
+ }
+
+
+
+ if ((map_fd = chr->server[i].fd) < 1 || sockt->session[map_fd] ==
+# 4543 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4543 "../../../server-code/src/char/char.c"
+ )
+ {
+ (showmsg->showError(("chr->parse_char: Attempting to write to invalid session %d! Map Server #%d disconnected.\n"), map_fd, i));
+ chr->server[i].fd = -1;
+ memset(&chr->server[i], 0, sizeof(struct mmo_map_server));
+ chr->authfail_fd(fd, 1);
+ return;
+ }
+
+ subnet_map_ip = chr->lan_subnet_check(ipl);
+
+ chr->send_map_info(fd, i, subnet_map_ip, cd);
+
+
+ ((node) = (struct char_auth_node *) (iMalloc->calloc(((1)),(sizeof(struct char_auth_node)),"../../../server-code/src/char/char.c", 4557, __func__)));
+ node->account_id = sd->account_id;
+ node->char_id = cd->char_id;
+ node->login_id1 = sd->login_id1;
+ node->login_id2 = sd->login_id2;
+ node->sex = sd->sex;
+ node->expiration_time = sd->expiration_time;
+ node->group_id = sd->group_id;
+ node->ip = ipl;
+ ( (auth_db)->put((auth_db),DB->i2key(sd->account_id),DB->ptr2data(node),
+# 4566 "../../../server-code/src/char/char.c" 3 4
+((void *)0)
+# 4566 "../../../server-code/src/char/char.c"
+) );
+}
+
+void char_creation_failed(int fd, int result)
+{
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x6e;
+
+
+
+
+ switch (result) {
+ case -1: WFIFOB(fd,2) = 0x00; break;
+ case -2: WFIFOB(fd,2) = 0xFF; break;
+ case -3: WFIFOB(fd,2) = 0x01; break;
+ case -4: WFIFOB(fd,2) = 0x03; break;
+ case -5: WFIFOB(fd,2) = 0x02; break;
+
+ default:
+ (showmsg->showWarning(("chr->parse_char: Unknown result received from chr->make_new_char_sql!\n")));
+ WFIFOB(fd,2) = 0xFF;
+ break;
+ }
+ WFIFOSET(fd,3);
+}
+
+void char_creation_ok(int fd, struct mmo_charstatus *char_dat)
+{
+ int len;
+
+
+ WFIFOHEAD(fd,2+150);
+ WFIFOW(fd,0) = 0x6d;
+ len = 2 + chr->mmo_char_tobuf(WFIFOP(fd,2), char_dat);
+ WFIFOSET(fd,len);
+}
+
+void char_parse_char_create_new_char(int fd, struct char_session_data* sd) __attribute__((nonnull (2)));
+void char_parse_char_create_new_char(int fd, struct char_session_data* sd)
+{
+ int result;
+ if( !char_new ) {
+
+ result = -2;
+ } else {
+
+ result = chr->make_new_char_sql(sd, RFIFOP(fd,2), 1, 1, 1, 1, 1, 1, RFIFOB(fd,26),RFIFOW(fd,27),RFIFOW(fd,29));
+
+
+
+ }
+
+
+ if (result < 0) {
+ chr->creation_failed(fd, result);
+ } else {
+
+ struct mmo_charstatus char_dat;
+ chr->mmo_char_fromsql(result, &char_dat,
+# 4624 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 4624 "../../../server-code/src/char/char.c"
+ );
+ chr->creation_ok(fd, &char_dat);
+
+
+ sd->found_char[char_dat.slot] = result;
+ }
+
+ RFIFOSKIP(fd,31);
+
+
+
+}
+
+
+
+void char_delete_char_failed(int fd, int flag)
+{
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x70;
+ WFIFOB(fd,2) = flag;
+ WFIFOSET(fd,3);
+}
+
+void char_delete_char_ok(int fd)
+{
+ WFIFOHEAD(fd,2);
+ WFIFOW(fd,0) = 0x6f;
+ WFIFOSET(fd,2);
+}
+
+void char_parse_char_delete_char(int fd, struct char_session_data* sd, unsigned short cmd) __attribute__((nonnull (2)));
+void char_parse_char_delete_char(int fd, struct char_session_data* sd, unsigned short cmd)
+{
+ char email[40];
+ int cid = RFIFOL(fd,2);
+ int i;
+
+
+ if (pincode->enabled) {
+ struct online_char_data* character;
+ character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->get((chr->online_char_db),DB->i2key(sd->account_id))) );
+ if( character && character->pincode_enable == -1 ){
+ chr->auth_error(fd, 0);
+ RFIFOSKIP(fd,( cmd == 0x68) ? 46 : 56);
+ return;
+ }
+ }
+
+ (showmsg->showInfo(("\033[1;31m""Request Char Deletion: ""\033[1;32m""%d (%d)""\033[0m""\n"), sd->account_id, cid));
+ memcpy(email, RFIFOP(fd,6), 40);
+ RFIFOSKIP(fd,( cmd == 0x68) ? 46 : 56);
+
+
+ if (strcasecmp(email, sd->email) != 0
+ && ( strcmp("a@a.com", sd->email) != 0
+ || (strcmp("a@a.com", email) != 0 && strcmp("", email) != 0)
+ )) {
+
+ chr->delete_char_failed(fd, 0);
+ return;
+ }
+
+
+ do { for ((i) = (0); (i) < (9); ++(i)) if (sd->found_char[i] == cid) break; } while(
+# 4687 "../../../server-code/src/char/char.c" 3 4
+0
+# 4687 "../../../server-code/src/char/char.c"
+);
+ if( i == 9 )
+ {
+ chr->delete_char_failed(fd, 0);
+ return;
+ }
+
+
+ sd->found_char[i] = -1;
+
+
+ if(chr->delete_char_sql(cid)<0){
+
+
+
+ chr->delete_char_failed(fd, 0);
+ return;
+ }
+
+ chr->delete_char_ok(fd);
+}
+
+void char_parse_char_ping(int fd)
+{
+ RFIFOSKIP(fd,6);
+}
+
+void char_allow_rename(int fd, int flag)
+{
+ WFIFOHEAD(fd, 4);
+ WFIFOW(fd,0) = 0x28e;
+ WFIFOW(fd,2) = flag;
+ WFIFOSET(fd,4);
+}
+
+void char_parse_char_rename_char(int fd, struct char_session_data* sd) __attribute__((nonnull (2)));
+void char_parse_char_rename_char(int fd, struct char_session_data* sd)
+{
+ int i, cid =RFIFOL(fd,2);
+ char name[(23 + 1)];
+ char esc_name[(23 + 1)*2+1];
+ (strlib->safestrncpy_((name),(RFIFOP(fd,6)),((23 + 1))));
+ RFIFOSKIP(fd,30);
+
+ do { for ((i) = (0); (i) < (9); ++(i)) if (sd->found_char[i] == cid) break; } while(
+# 4731 "../../../server-code/src/char/char.c" 3 4
+0
+# 4731 "../../../server-code/src/char/char.c"
+);
+ if( i == 9 )
+ return;
+
+ (strlib->normalize_name_((name),("\255\xA0\032\t\x0A\x0D ")));
+ SQL->EscapeStringLen(inter->sql_handle, esc_name, name, (strlib->strnlen_((name),((23 + 1)))));
+ if( !chr->check_char_name(name,esc_name) ) {
+ i = 1;
+ (strlib->safestrncpy_((sd->new_name),(name),((23 + 1))));
+ } else {
+ i = 0;
+ }
+
+ chr->allow_rename(fd, i);
+}
+
+void char_parse_char_rename_char2(int fd, struct char_session_data* sd) __attribute__((nonnull (2)));
+void char_parse_char_rename_char2(int fd, struct char_session_data* sd)
+{
+ int i, aid = RFIFOL(fd,2), cid =RFIFOL(fd,6);
+ char name[(23 + 1)];
+ char esc_name[(23 + 1)*2+1];
+ (strlib->safestrncpy_((name),(RFIFOP(fd,10)),((23 + 1))));
+ RFIFOSKIP(fd,34);
+
+ if( aid != sd->account_id )
+ return;
+ do { for ((i) = (0); (i) < (9); ++(i)) if (sd->found_char[i] == cid) break; } while(
+# 4758 "../../../server-code/src/char/char.c" 3 4
+0
+# 4758 "../../../server-code/src/char/char.c"
+);
+ if( i == 9 )
+ return;
+
+ (strlib->normalize_name_((name),("\255\xA0\032\t\x0A\x0D ")));
+ SQL->EscapeStringLen(inter->sql_handle, esc_name, name, (strlib->strnlen_((name),((23 + 1)))));
+ if( !chr->check_char_name(name,esc_name) )
+ {
+ i = 1;
+ (strlib->safestrncpy_((sd->new_name),(name),((23 + 1))));
+ }
+ else
+ i = 0;
+
+ chr->allow_rename(fd, i);
+}
+
+void char_rename_char_ack(int fd, int flag)
+{
+ WFIFOHEAD(fd, 4);
+ WFIFOW(fd,0) = 0x290;
+ WFIFOW(fd,2) = flag;
+ WFIFOSET(fd,4);
+}
+
+void char_parse_char_rename_char_confirm(int fd, struct char_session_data* sd) __attribute__((nonnull (2)));
+void char_parse_char_rename_char_confirm(int fd, struct char_session_data* sd)
+{
+ int i;
+ int cid = RFIFOL(fd,2);
+ RFIFOSKIP(fd,6);
+
+ do { for ((i) = (0); (i) < (9); ++(i)) if (sd->found_char[i] == cid) break; } while(
+# 4790 "../../../server-code/src/char/char.c" 3 4
+0
+# 4790 "../../../server-code/src/char/char.c"
+);
+ if( i == 9 )
+ return;
+ i = chr->rename_char_sql(sd, cid);
+
+ chr->rename_char_ack(fd, i);
+}
+
+void char_captcha_notsupported(int fd)
+{
+ WFIFOHEAD(fd,5);
+ WFIFOW(fd,0) = 0x7e9;
+ WFIFOW(fd,2) = 5;
+ WFIFOB(fd,4) = 1;
+ WFIFOSET(fd,5);
+}
+
+void char_parse_char_request_captcha(int fd)
+{
+ chr->captcha_notsupported(fd);
+ RFIFOSKIP(fd,8);
+}
+
+void char_parse_char_check_captcha(int fd)
+{
+ chr->captcha_notsupported(fd);
+ RFIFOSKIP(fd,32);
+}
+
+void char_parse_char_delete2_req(int fd, struct char_session_data* sd)
+{
+ chr->delete2_req(fd, sd);
+ RFIFOSKIP(fd,6);
+}
+
+void char_parse_char_delete2_accept(int fd, struct char_session_data* sd)
+{
+ chr->delete2_accept(fd, sd);
+ RFIFOSKIP(fd,12);
+}
+
+void char_parse_char_delete2_cancel(int fd, struct char_session_data* sd)
+{
+ chr->delete2_cancel(fd, sd);
+ RFIFOSKIP(fd,6);
+}
+
+
+
+
+void char_login_map_server_ack(int fd, uint8 flag)
+{
+ WFIFOHEAD(fd,3);
+ WFIFOW(fd,0) = 0x2af9;
+ WFIFOB(fd,2) = flag;
+ WFIFOSET(fd,3);
+}
+
+void char_parse_char_login_map_server(int fd, uint32 ipl)
+{
+ char l_user[24], l_pass[24];
+ int i;
+ (strlib->safestrncpy_((l_user),(RFIFOP(fd,2)),(24)));
+ (strlib->safestrncpy_((l_pass),(RFIFOP(fd,26)),(24)));
+
+ do { for ((i) = (0); (i) < (( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) )); ++(i)) if (chr->server[i].fd <= 0) break; } while(
+# 4855 "../../../server-code/src/char/char.c" 3 4
+0
+# 4855 "../../../server-code/src/char/char.c"
+);
+ if (core->runflag != CHARSERVER_ST_RUNNING ||
+ i == ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ) ||
+ strcmp(l_user, chr->userid) != 0 ||
+ strcmp(l_pass, chr->passwd) != 0 ||
+ !sockt->allowed_ip_check(ipl))
+ {
+ chr->login_map_server_ack(fd, 3);
+ } else {
+ chr->login_map_server_ack(fd, 0);
+
+ chr->server[i].fd = fd;
+ chr->server[i].ip = ntohl(RFIFOL(fd,54));
+ chr->server[i].port = ntohs(RFIFOW(fd,58));
+ chr->server[i].users = 0;
+ sockt->session[fd]->func_parse = chr->parse_frommap;
+ sockt->session[fd]->flag.server = 1;
+ sockt->realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ chr->mapif_init(fd);
+ }
+ sockt->datasync(fd,
+# 4875 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 4875 "../../../server-code/src/char/char.c"
+ );
+
+ RFIFOSKIP(fd,60);
+}
+
+void char_parse_char_pincode_check(int fd, struct char_session_data* sd) __attribute__((nonnull (2)));
+void char_parse_char_pincode_check(int fd, struct char_session_data* sd)
+{
+ if (RFIFOL(fd,2) == sd->account_id)
+ pincode->check(fd, sd);
+
+ RFIFOSKIP(fd, 10);
+}
+
+void char_parse_char_pincode_window(int fd, struct char_session_data* sd) __attribute__((nonnull (2)));
+void char_parse_char_pincode_window(int fd, struct char_session_data* sd)
+{
+ if (RFIFOL(fd,2) == sd->account_id)
+ pincode->sendstate(fd, sd, PINCODE_NOTSET);
+
+ RFIFOSKIP(fd, 6);
+}
+
+void char_parse_char_pincode_change(int fd, struct char_session_data* sd) __attribute__((nonnull (2)));
+void char_parse_char_pincode_change(int fd, struct char_session_data* sd)
+{
+ if (RFIFOL(fd,2) == sd->account_id)
+ pincode->change(fd, sd);
+
+ RFIFOSKIP(fd, 14);
+}
+
+void char_parse_char_pincode_first_pin(int fd, struct char_session_data* sd) __attribute__((nonnull (2)));
+void char_parse_char_pincode_first_pin(int fd, struct char_session_data* sd)
+{
+ if (RFIFOL(fd,2) == sd->account_id)
+ pincode->setnew (fd, sd);
+ RFIFOSKIP(fd, 10);
+}
+
+void char_parse_char_request_chars(int fd, struct char_session_data* sd)
+{
+ chr->mmo_char_send099d(fd, sd);
+ RFIFOSKIP(fd,2);
+}
+
+void char_change_character_slot_ack(int fd,
+# 4921 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 4921 "../../../server-code/src/char/char.c"
+ ret)
+{
+ WFIFOHEAD(fd, 8);
+ WFIFOW(fd,0) = 0x8d5;
+ WFIFOW(fd,2) = 8;
+ WFIFOW(fd,4) = ret?0:1;
+ WFIFOW(fd,6) = 0;
+ WFIFOSET(fd, 8);
+}
+
+void char_parse_char_move_character(int fd, struct char_session_data* sd)
+{
+
+# 4933 "../../../server-code/src/char/char.c" 3 4
+_Bool
+# 4933 "../../../server-code/src/char/char.c"
+ ret = chr->char_slotchange(sd, fd, RFIFOW(fd, 2), RFIFOW(fd, 4));
+ chr->change_character_slot_ack(fd, ret);
+
+ if( ret )
+
+ chr->mmo_char_send099d(fd, sd);
+
+
+
+ RFIFOSKIP(fd, 8);
+}
+
+int char_parse_char_unknown_packet(int fd, uint32 ipl)
+{
+ (showmsg->showError(("chr->parse_char: Received unknown packet ""\033[1;37m""0x%x""\033[0m"" from ip '""\033[1;37m""%s""\033[0m""'! Disconnecting!\n"), RFIFOW(fd,0), sockt->ip2str(ipl,
+# 4947 "../../../server-code/src/char/char.c" 3 4
+((void *)0)
+# 4947 "../../../server-code/src/char/char.c"
+)));
+ sockt->eof(fd);
+ return 1;
+}
+
+int char_parse_char(int fd)
+{
+ unsigned short cmd;
+ struct char_session_data* sd;
+ uint32 ipl = sockt->session[fd]->client_addr;
+
+ sd = (struct char_session_data*)sockt->session[fd]->session_data;
+
+
+ if(chr->login_fd < 0)
+ sockt->eof(fd);
+
+ if(sockt->session[fd]->flag.eof)
+ {
+ if( sd !=
+# 4966 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4966 "../../../server-code/src/char/char.c"
+ && sd->auth ) {
+
+ struct online_char_data* data = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->get((chr->online_char_db),DB->i2key(sd->account_id))) );
+ if( data !=
+# 4969 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4969 "../../../server-code/src/char/char.c"
+ && data->fd == fd)
+ data->fd = -1;
+ if( data ==
+# 4971 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 4971 "../../../server-code/src/char/char.c"
+ || data->server == -1)
+ chr->set_char_offline(-1,sd->account_id);
+ }
+ sockt->close(fd);
+ return 0;
+ }
+
+ while (RFIFOREST(fd) >= 2) {
+ cmd = RFIFOW(fd,0);
+
+
+
+
+ if (( (HPM->packets[hpParse_Char])._len_ ) > 0) {
+ int result = HPM->parse_packets(fd,cmd,hpParse_Char);
+ if (result == 1)
+ continue;
+ if (result == 2)
+ return 0;
+ }
+
+ switch (cmd) {
+
+
+ case 0x65:
+ if( RFIFOREST(fd) < 17 )
+ return 0;
+ {
+ chr->parse_char_connect(fd, sd, ipl);
+ }
+ break;
+
+
+ case 0x66:
+ do { if(RFIFOREST(fd) < (3)) return 0; if (sd==
+# 5005 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5005 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(3)); return 0; } } while (0);
+ {
+ chr->parse_char_select(fd, sd, ipl);
+ }
+ break;
+
+
+
+
+ case 0x970:
+ {
+ do { if(RFIFOREST(fd) < (31)) return 0; if (sd==
+# 5016 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5016 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(31)); return 0; } } while (0);
+
+
+
+
+
+
+
+ chr->parse_char_create_new_char(fd, sd);
+ }
+ break;
+
+
+ case 0x68:
+
+ case 0x1fb:
+ if (cmd == 0x68) do { if(RFIFOREST(fd) < (46)) return 0; if (sd==
+# 5032 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5032 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(46)); return 0; } } while (0);
+ if (cmd == 0x1fb) do { if(RFIFOREST(fd) < (56)) return 0; if (sd==
+# 5033 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5033 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(56)); return 0; } } while (0);
+ {
+ chr->parse_char_delete_char(fd, sd, cmd);
+ }
+ break;
+
+
+
+ case 0x187:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ chr->parse_char_ping(fd);
+ break;
+
+
+ case 0x8fc:
+ do { if(RFIFOREST(fd) < (30)) return 0; if (sd==
+# 5049 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5049 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(30)); return 0; } } while (0);
+ {
+ chr->parse_char_rename_char(fd, sd);
+ }
+ break;
+
+
+
+ case 0x28d:
+ do { if(RFIFOREST(fd) < (34)) return 0; if (sd==
+# 5058 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5058 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(34)); return 0; } } while (0);
+ {
+ chr->parse_char_rename_char2(fd, sd);
+ }
+ break;
+
+
+ case 0x28f:
+
+
+
+
+
+ do { if(RFIFOREST(fd) < (6)) return 0; if (sd==
+# 5071 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5071 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(6)); return 0; } } while (0);
+ {
+ chr->parse_char_rename_char_confirm(fd, sd);
+ }
+ break;
+
+
+
+ case 0x7e5:
+ chr->parse_char_request_captcha(fd);
+ break;
+
+
+
+ case 0x7e7:
+ chr->parse_char_check_captcha(fd);
+ break;
+
+
+ case 0x827:
+ do { if(RFIFOREST(fd) < (6)) return 0; if (sd==
+# 5091 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5091 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(6)); return 0; } } while (0);
+ chr->parse_char_delete2_req(fd, sd);
+ break;
+
+
+ case 0x829:
+ do { if(RFIFOREST(fd) < (12)) return 0; if (sd==
+# 5097 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5097 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(12)); return 0; } } while (0);
+ chr->parse_char_delete2_accept(fd, sd);
+ break;
+
+
+ case 0x82b:
+ do { if(RFIFOREST(fd) < (6)) return 0; if (sd==
+# 5103 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5103 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(6)); return 0; } } while (0);
+ chr->parse_char_delete2_cancel(fd, sd);
+ break;
+
+
+ case 0x2af8:
+ if (RFIFOREST(fd) < 60)
+ return 0;
+ {
+ chr->parse_char_login_map_server(fd, ipl);
+ }
+ return 0;
+
+
+ case 0x8b8:
+ do { if(RFIFOREST(fd) < (10)) return 0; if (sd==
+# 5118 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5118 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(10)); return 0; } } while (0);
+ chr->parse_char_pincode_check(fd, sd);
+ break;
+
+
+ case 0x8c5:
+ do { if(RFIFOREST(fd) < (6)) return 0; if (sd==
+# 5124 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5124 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(6)); return 0; } } while (0);
+ chr->parse_char_pincode_window(fd, sd);
+ break;
+
+
+ case 0x8be:
+ do { if(RFIFOREST(fd) < (14)) return 0; if (sd==
+# 5130 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5130 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(14)); return 0; } } while (0);
+ chr->parse_char_pincode_change(fd, sd);
+ break;
+
+
+ case 0x8ba:
+ do { if(RFIFOREST(fd) < (10)) return 0; if (sd==
+# 5136 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5136 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(10)); return 0; } } while (0);
+ chr->parse_char_pincode_first_pin(fd, sd);
+ break;
+
+ case 0x9a1:
+ do { if(RFIFOREST(fd) < (2)) return 0; if (sd==
+# 5141 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5141 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(2)); return 0; } } while (0);
+ chr->parse_char_request_chars(fd, sd);
+ break;
+
+
+ case 0x8d4:
+ do { if(RFIFOREST(fd) < (8)) return 0; if (sd==
+# 5147 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5147 "../../../server-code/src/char/char.c"
+ || !sd->auth) { RFIFOSKIP(fd,(8)); return 0; } } while (0);
+ {
+ chr->parse_char_move_character(fd, sd);
+ }
+ break;
+
+
+ default:
+ if (chr->parse_char_unknown_packet(fd, ipl))
+ return 0;
+ }
+ }
+
+ RFIFOFLUSH(fd);
+ return 0;
+}
+
+int mapif_sendall(const unsigned char *buf, unsigned int len)
+{
+ int i, c;
+
+ do { if (((void)(buf),
+# 5168 "../../../server-code/src/char/char.c" 3 4
+0
+# 5168 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ c = 0;
+ for(i = 0; i < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ); i++) {
+ int fd;
+ if ((fd = chr->server[i].fd) > 0) {
+ WFIFOHEAD(fd,len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ c++;
+ }
+ }
+
+ return c;
+}
+
+int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len)
+{
+ int i, c;
+
+ do { if (((void)(buf),
+# 5187 "../../../server-code/src/char/char.c" 3 4
+0
+# 5187 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ c = 0;
+ for(i = 0; i < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ); i++) {
+ int fd;
+ if ((fd = chr->server[i].fd) > 0 && fd != sfd) {
+ WFIFOHEAD(fd,len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ c++;
+ }
+ }
+
+ return c;
+}
+
+int mapif_send(int fd, unsigned char *buf, unsigned int len)
+{
+ do { if (((void)(buf),
+# 5204 "../../../server-code/src/char/char.c" 3 4
+0
+# 5204 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ if (fd >= 0) {
+ int i;
+ do { for ((i) = (0); (i) < (( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) )); ++(i)) if (fd == chr->server[i].fd) break; } while(
+# 5207 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 5207 "../../../server-code/src/char/char.c"
+ );
+ if( i < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ) )
+ {
+ WFIFOHEAD(fd,len);
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void mapif_send_users_count(int users)
+{
+ uint8 buf[6];
+
+ WBUFW(buf,0) = 0x2b00;
+ WBUFL(buf,2) = users;
+ mapif->sendall(buf,6);
+}
+
+int char_broadcast_user_count(int tid, int64 tick, int id, intptr_t data) {
+ int users = chr->count_users();
+
+
+ static int prev_users = 0;
+ if( prev_users == users )
+ return 0;
+ prev_users = users;
+
+ if( chr->login_fd > 0 && sockt->session[chr->login_fd] )
+ {
+
+ loginif->send_users_count(users);
+ }
+
+ mapif->send_users_count(users);
+
+ return 0;
+}
+
+
+
+
+
+static int char_send_accounts_tologin_sub(union DBKey key, struct DBData *data, va_list ap)
+{
+ struct online_char_data* character = DB->data2ptr(data);
+ int* i =
+# 5255 "../../../server-code/src/char/char.c" 3 4
+ __builtin_va_arg(
+# 5255 "../../../server-code/src/char/char.c"
+ ap
+# 5255 "../../../server-code/src/char/char.c" 3 4
+ ,
+# 5255 "../../../server-code/src/char/char.c"
+ int*
+# 5255 "../../../server-code/src/char/char.c" 3 4
+ )
+# 5255 "../../../server-code/src/char/char.c"
+ ;
+
+ do { if (((void)(character),
+# 5257 "../../../server-code/src/char/char.c" 3 4
+0
+# 5257 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ if(character->server > -1)
+ {
+ WFIFOL(chr->login_fd,8+(*i)*4) = character->account_id;
+ (*i)++;
+ return 1;
+ }
+ return 0;
+}
+
+int char_send_accounts_tologin(int tid, int64 tick, int id, intptr_t data) {
+ if (chr->login_fd > 0 && sockt->session[chr->login_fd])
+ {
+
+ int users = chr->online_char_db->size(chr->online_char_db);
+ int i = 0;
+
+ WFIFOHEAD(chr->login_fd,8+users*4);
+ WFIFOW(chr->login_fd,0) = 0x272d;
+ chr->online_char_db->foreach(chr->online_char_db, chr->send_accounts_tologin_sub, &i, users);
+ WFIFOW(chr->login_fd,2) = 8+ i*4;
+ WFIFOL(chr->login_fd,4) = i;
+ WFIFOSET(chr->login_fd,WFIFOW(chr->login_fd,2));
+ }
+ return 0;
+}
+
+int char_check_connect_login_server(int tid, int64 tick, int id, intptr_t data) {
+ if (chr->login_fd > 0 && sockt->session[chr->login_fd] !=
+# 5285 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5285 "../../../server-code/src/char/char.c"
+ )
+ return 0;
+
+ (showmsg->showInfo(("Attempt to connect to login-server...\n")));
+
+ if ((chr->login_fd = sockt->make_connection(login_ip, login_port,
+# 5290 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5290 "../../../server-code/src/char/char.c"
+ )) == -1) {
+ chr->login_fd = 0;
+ return 0;
+ }
+
+ sockt->session[chr->login_fd]->func_parse = chr->parse_fromlogin;
+ sockt->session[chr->login_fd]->flag.server = 1;
+ sockt->realloc_fifo(chr->login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+
+ loginif->connect_to_server();
+
+ return 1;
+}
+
+
+
+
+
+static int char_waiting_disconnect(int tid, int64 tick, int id, intptr_t data) {
+ struct online_char_data* character;
+ if ((character = (struct online_char_data*)( DB->data2ptr((chr->online_char_db)->get((chr->online_char_db),DB->i2key(id))) )) !=
+# 5310 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5310 "../../../server-code/src/char/char.c"
+ && character->waiting_disconnect == tid) {
+
+ character->waiting_disconnect = (-1);
+ chr->set_char_offline(character->char_id, character->account_id);
+ }
+ return 0;
+}
+
+
+
+
+static int char_online_data_cleanup_sub(union DBKey key, struct DBData *data, va_list ap)
+{
+ struct online_char_data *character= DB->data2ptr(data);
+ do { if (((void)(character),
+# 5324 "../../../server-code/src/char/char.c" 3 4
+0
+# 5324 "../../../server-code/src/char/char.c"
+)) return(0); } while(0);
+ if (character->fd != -1)
+ return 0;
+ if (character->server == -2)
+ chr->set_char_offline(character->char_id, character->account_id);
+ if (character->server < 0)
+
+ ( (chr->online_char_db)->remove((chr->online_char_db),(key),
+# 5331 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5331 "../../../server-code/src/char/char.c"
+ ) );
+ return 0;
+}
+
+static int char_online_data_cleanup(int tid, int64 tick, int id, intptr_t data) {
+ chr->online_char_db->foreach(chr->online_char_db, chr->online_data_cleanup_sub);
+ return 0;
+}
+
+void char_sql_config_read(const char* cfgName)
+{
+ char line[1024], w1[1024], w2[1024];
+ FILE* fp;
+
+ if ((fp = fopen(cfgName, "r")) ==
+# 5345 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5345 "../../../server-code/src/char/char.c"
+ ) {
+ (showmsg->showError(("File not found: %s\n"), cfgName));
+ return;
+ }
+
+ while(fgets(line, sizeof(line), fp))
+ {
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ if (sscanf(line, "%1023[^:]: %1023[^\r\n]", w1, w2) != 2)
+ continue;
+
+ if(!strcasecmp(w1,"char_db"))
+ (strlib->safestrncpy_((char_db),(w2),(sizeof(char_db))));
+ else if(!strcasecmp(w1,"scdata_db"))
+ (strlib->safestrncpy_((scdata_db),(w2),(sizeof(scdata_db))));
+ else if(!strcasecmp(w1,"cart_db"))
+ (strlib->safestrncpy_((cart_db),(w2),(sizeof(cart_db))));
+ else if(!strcasecmp(w1,"inventory_db"))
+ (strlib->safestrncpy_((inventory_db),(w2),(sizeof(inventory_db))));
+ else if(!strcasecmp(w1,"charlog_db"))
+ (strlib->safestrncpy_((charlog_db),(w2),(sizeof(charlog_db))));
+ else if(!strcasecmp(w1,"storage_db"))
+ (strlib->safestrncpy_((storage_db),(w2),(sizeof(storage_db))));
+ else if(!strcasecmp(w1,"skill_db"))
+ (strlib->safestrncpy_((skill_db),(w2),(sizeof(skill_db))));
+ else if(!strcasecmp(w1,"interlog_db"))
+ (strlib->safestrncpy_((interlog_db),(w2),(sizeof(interlog_db))));
+ else if(!strcasecmp(w1,"memo_db"))
+ (strlib->safestrncpy_((memo_db),(w2),(sizeof(memo_db))));
+ else if(!strcasecmp(w1,"guild_db"))
+ (strlib->safestrncpy_((guild_db),(w2),(sizeof(guild_db))));
+ else if(!strcasecmp(w1,"guild_alliance_db"))
+ (strlib->safestrncpy_((guild_alliance_db),(w2),(sizeof(guild_alliance_db))));
+ else if(!strcasecmp(w1,"guild_castle_db"))
+ (strlib->safestrncpy_((guild_castle_db),(w2),(sizeof(guild_castle_db))));
+ else if(!strcasecmp(w1,"guild_expulsion_db"))
+ (strlib->safestrncpy_((guild_expulsion_db),(w2),(sizeof(guild_expulsion_db))));
+ else if(!strcasecmp(w1,"guild_member_db"))
+ (strlib->safestrncpy_((guild_member_db),(w2),(sizeof(guild_member_db))));
+ else if(!strcasecmp(w1,"guild_skill_db"))
+ (strlib->safestrncpy_((guild_skill_db),(w2),(sizeof(guild_skill_db))));
+ else if(!strcasecmp(w1,"guild_position_db"))
+ (strlib->safestrncpy_((guild_position_db),(w2),(sizeof(guild_position_db))));
+ else if(!strcasecmp(w1,"guild_storage_db"))
+ (strlib->safestrncpy_((guild_storage_db),(w2),(sizeof(guild_storage_db))));
+ else if(!strcasecmp(w1,"party_db"))
+ (strlib->safestrncpy_((party_db),(w2),(sizeof(party_db))));
+ else if(!strcasecmp(w1,"pet_db"))
+ (strlib->safestrncpy_((pet_db),(w2),(sizeof(pet_db))));
+ else if(!strcasecmp(w1,"mail_db"))
+ (strlib->safestrncpy_((mail_db),(w2),(sizeof(mail_db))));
+ else if(!strcasecmp(w1,"auction_db"))
+ (strlib->safestrncpy_((auction_db),(w2),(sizeof(auction_db))));
+ else if(!strcasecmp(w1,"friend_db"))
+ (strlib->safestrncpy_((friend_db),(w2),(sizeof(friend_db))));
+ else if(!strcasecmp(w1,"hotkey_db"))
+ (strlib->safestrncpy_((hotkey_db),(w2),(sizeof(hotkey_db))));
+ else if(!strcasecmp(w1,"quest_db"))
+ (strlib->safestrncpy_((quest_db),(w2),(sizeof(quest_db))));
+ else if(!strcasecmp(w1,"homunculus_db"))
+ (strlib->safestrncpy_((homunculus_db),(w2),(sizeof(homunculus_db))));
+ else if(!strcasecmp(w1,"skill_homunculus_db"))
+ (strlib->safestrncpy_((skill_homunculus_db),(w2),(sizeof(skill_homunculus_db))));
+ else if(!strcasecmp(w1,"mercenary_db"))
+ (strlib->safestrncpy_((mercenary_db),(w2),(sizeof(mercenary_db))));
+ else if(!strcasecmp(w1,"mercenary_owner_db"))
+ (strlib->safestrncpy_((mercenary_owner_db),(w2),(sizeof(mercenary_owner_db))));
+ else if(!strcasecmp(w1,"ragsrvinfo_db"))
+ (strlib->safestrncpy_((ragsrvinfo_db),(w2),(sizeof(ragsrvinfo_db))));
+ else if(!strcasecmp(w1,"elemental_db"))
+ (strlib->safestrncpy_((elemental_db),(w2),(sizeof(elemental_db))));
+ else if(!strcasecmp(w1,"account_data_db"))
+ (strlib->safestrncpy_((account_data_db),(w2),(sizeof(account_data_db))));
+ else if(!strcasecmp(w1,"char_reg_num_db"))
+ (strlib->safestrncpy_((char_reg_num_db),(w2),(sizeof(char_reg_num_db))));
+ else if(!strcasecmp(w1,"char_reg_str_db"))
+ (strlib->safestrncpy_((char_reg_str_db),(w2),(sizeof(char_reg_str_db))));
+ else if(!strcasecmp(w1,"acc_reg_str_db"))
+ (strlib->safestrncpy_((acc_reg_str_db),(w2),(sizeof(acc_reg_str_db))));
+ else if(!strcasecmp(w1,"acc_reg_num_db"))
+ (strlib->safestrncpy_((acc_reg_num_db),(w2),(sizeof(acc_reg_num_db))));
+
+ else if(!strcasecmp(w1,"import"))
+ chr->sql_config_read(w2);
+ else
+ HPM->parseConf(w1, w2, HPCT_CHAR_INTER);
+ }
+ fclose(fp);
+ (showmsg->showInfo(("Done reading %s.\n"), cfgName));
+}
+
+void char_config_dispatch(char *w1, char *w2) {
+
+# 5439 "../../../server-code/src/char/char.c" 3 4
+_Bool
+# 5439 "../../../server-code/src/char/char.c"
+ (*dispatch_to[]) (char *w1, char *w2) = {
+
+ pincode->config_read
+ };
+ int i, len = ( (int)(sizeof(dispatch_to)/sizeof((dispatch_to)[0])) );
+ for(i = 0; i < len; i++) {
+ if( (*dispatch_to[i])(w1,w2) )
+ break;
+ }
+ if (i == len)
+ HPM->parseConf(w1, w2, HPCT_CHAR);
+}
+
+int char_config_read(const char* cfgName)
+{
+ char line[1024], w1[1024], w2[1024];
+ FILE* fp = fopen(cfgName, "r");
+
+ if (fp ==
+# 5457 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5457 "../../../server-code/src/char/char.c"
+ ) {
+ (showmsg->showError(("Configuration file not found: %s.\n"), cfgName));
+ return 1;
+ }
+
+ while(fgets(line, sizeof(line), fp)) {
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ if (sscanf(line, "%1023[^:]: %1023[^\r\n]", w1, w2) != 2)
+ continue;
+
+ (strlib->remove_control_chars_(w1));
+ (strlib->remove_control_chars_(w2));
+ if(strcasecmp(w1,"timestamp_format") == 0) {
+ (strlib->safestrncpy_((showmsg->timestamp_format),(w2),(sizeof(showmsg->timestamp_format))));
+ } else if(strcasecmp(w1,"console_silent")==0){
+ showmsg->silent = atoi(w2);
+ if (showmsg->silent)
+ (showmsg->showInfo(("Console Silent Setting: %d\n"), atoi(w2)));
+ } else if(strcasecmp(w1,"stdout_with_ansisequence")==0){
+ showmsg->stdout_with_ansisequence = (strlib->config_switch_(w2)) ?
+# 5478 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 5478 "../../../server-code/src/char/char.c"
+ :
+# 5478 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 5478 "../../../server-code/src/char/char.c"
+ ;
+ } else if (strcasecmp(w1, "userid") == 0) {
+ (strlib->safestrncpy_((chr->userid),(w2),(sizeof(chr->userid))));
+ } else if (strcasecmp(w1, "passwd") == 0) {
+ (strlib->safestrncpy_((chr->passwd),(w2),(sizeof(chr->passwd))));
+ } else if (strcasecmp(w1, "server_name") == 0) {
+ (strlib->safestrncpy_((chr->server_name),(w2),(sizeof(chr->server_name))));
+ } else if (strcasecmp(w1, "wisp_server_name") == 0) {
+ if (strlen(w2) >= 4) {
+ (strlib->safestrncpy_((wisp_server_name),(w2),(sizeof(wisp_server_name))));
+ }
+ } else if (strcasecmp(w1, "login_ip") == 0) {
+ login_ip = sockt->host2ip(w2);
+ if (login_ip) {
+ char ip_str[16];
+ (strlib->safestrncpy_((login_ip_str),(w2),(sizeof(login_ip_str))));
+ (showmsg->showStatus(("Login server IP address : %s -> %s\n"), w2, sockt->ip2str(login_ip, ip_str)));
+ }
+ } else if (strcasecmp(w1, "login_port") == 0) {
+ login_port = atoi(w2);
+ } else if (strcasecmp(w1, "char_ip") == 0) {
+ chr->ip = sockt->host2ip(w2);
+ if (chr->ip) {
+ char ip_str[16];
+ (strlib->safestrncpy_((char_ip_str),(w2),(sizeof(char_ip_str))));
+ (showmsg->showStatus(("Character server IP address : %s -> %s\n"), w2, sockt->ip2str(chr->ip, ip_str)));
+ }
+ } else if (strcasecmp(w1, "bind_ip") == 0) {
+ bind_ip = sockt->host2ip(w2);
+ if (bind_ip) {
+ char ip_str[16];
+ (strlib->safestrncpy_((bind_ip_str),(w2),(sizeof(bind_ip_str))));
+ (showmsg->showStatus(("Character server binding IP address : %s -> %s\n"), w2, sockt->ip2str(bind_ip, ip_str)));
+ }
+ } else if (strcasecmp(w1, "char_port") == 0) {
+ chr->port = atoi(w2);
+ } else if (strcasecmp(w1, "char_server_type") == 0) {
+ chr->server_type = atoi(w2);
+ } else if (strcasecmp(w1, "char_new") == 0) {
+ char_new = (
+# 5517 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 5517 "../../../server-code/src/char/char.c"
+ )atoi(w2);
+ } else if (strcasecmp(w1, "char_new_display") == 0) {
+ chr->new_display = atoi(w2);
+ } else if (strcasecmp(w1, "max_connect_user") == 0) {
+ max_connect_user = atoi(w2);
+ if (max_connect_user < -1)
+ max_connect_user = -1;
+ } else if(strcasecmp(w1, "gm_allow_group") == 0) {
+ gm_allow_group = atoi(w2);
+ } else if (strcasecmp(w1, "autosave_time") == 0) {
+ autosave_interval = atoi(w2) * 1000;
+ if (autosave_interval <= 0)
+ autosave_interval = (300*1000);
+ } else if (strcasecmp(w1, "save_log") == 0) {
+ save_log = (strlib->config_switch_(w2));
+ }
+
+ else if (strcasecmp(w1, "start_point_re") == 0) {
+ char map[((11 + 1) + 4)];
+ int x, y;
+ if (sscanf(w2, "%15[^,],%d,%d", map, &x, &y) < 3)
+ continue;
+ start_point.map = mapindex->name2id(map);
+ if (!start_point.map)
+ (showmsg->showError(("Specified start_point_re '%s' not found in map-index cache.\n"), map));
+ start_point.x = x;
+ start_point.y = y;
+ }
+# 5558 "../../../server-code/src/char/char.c"
+ else if (strcasecmp(w1, "start_items") == 0) {
+ int i;
+ char *split;
+
+ i = 0;
+ split = strtok(w2, ",");
+ while (split !=
+# 5564 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5564 "../../../server-code/src/char/char.c"
+ && i < 32 * 3) {
+ char *split2 = split;
+ split = strtok(
+# 5566 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5566 "../../../server-code/src/char/char.c"
+ , ",");
+ start_items[i] = atoi(split2);
+
+ if (start_items[i] < 0)
+ start_items[i] = 0;
+
+ ++i;
+ }
+
+
+ if( i%3 )
+ {
+ (showmsg->showWarning(("chr->config_read: There are not enough parameters in start_items, ignoring last item...\n")));
+ if( i%3 == 1 )
+ start_items[i-1] = 0;
+ else
+ start_items[i-2] = 0;
+ }
+ } else if (strcasecmp(w1, "start_zeny") == 0) {
+ start_zeny = atoi(w2);
+ if (start_zeny < 0)
+ start_zeny = 0;
+ } else if(strcasecmp(w1,"log_char")==0) {
+ log_char = atoi(w2);
+ } else if (strcasecmp(w1, "unknown_char_name") == 0) {
+ (strlib->safestrncpy_((unknown_char_name),(w2),(sizeof(unknown_char_name))));
+ unknown_char_name[(23 + 1)-1] = '\0';
+ } else if (strcasecmp(w1, "name_ignoring_case") == 0) {
+ name_ignoring_case = (
+# 5594 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 5594 "../../../server-code/src/char/char.c"
+ )(strlib->config_switch_(w2));
+ } else if (strcasecmp(w1, "char_name_option") == 0) {
+ char_name_option = atoi(w2);
+ } else if (strcasecmp(w1, "char_name_letters") == 0) {
+ (strlib->safestrncpy_((char_name_letters),(w2),(sizeof(char_name_letters))));
+ } else if (strcasecmp(w1, "char_del_level") == 0) {
+ char_del_level = atoi(w2);
+ } else if (strcasecmp(w1, "char_del_delay") == 0) {
+ char_del_delay = atoi(w2);
+ } else if (strcasecmp(w1, "char_aegis_delete") == 0) {
+ char_aegis_delete = atoi(w2);
+ } else if(strcasecmp(w1,"db_path")==0) {
+ (strlib->safestrncpy_((db_path),(w2),(sizeof(db_path))));
+ } else if (strcasecmp(w1, "fame_list_alchemist") == 0) {
+ fame_list_size_chemist = atoi(w2);
+ if (fame_list_size_chemist > 10) {
+ (showmsg->showWarning(("Max fame list size is %d (fame_list_alchemist)\n"), 10));
+ fame_list_size_chemist = 10;
+ }
+ } else if (strcasecmp(w1, "fame_list_blacksmith") == 0) {
+ fame_list_size_smith = atoi(w2);
+ if (fame_list_size_smith > 10) {
+ (showmsg->showWarning(("Max fame list size is %d (fame_list_blacksmith)\n"), 10));
+ fame_list_size_smith = 10;
+ }
+ } else if (strcasecmp(w1, "fame_list_taekwon") == 0) {
+ fame_list_size_taekwon = atoi(w2);
+ if (fame_list_size_taekwon > 10) {
+ (showmsg->showWarning(("Max fame list size is %d (fame_list_taekwon)\n"), 10));
+ fame_list_size_taekwon = 10;
+ }
+ } else if (strcasecmp(w1, "guild_exp_rate") == 0) {
+ guild_exp_rate = atoi(w2);
+ } else if (strcasecmp(w1, "char_maintenance_min_group_id") == 0) {
+ char_maintenance_min_group_id = atoi(w2);
+ } else if (strcasecmp(w1, "import") == 0) {
+ chr->config_read(w2);
+ } else
+ chr->config_dispatch(w1,w2);
+ }
+ fclose(fp);
+
+ (showmsg->showInfo(("Done reading %s.\n"), cfgName));
+ return 0;
+}
+
+int do_final(void) {
+ int i;
+
+ (showmsg->showStatus(("Terminating...\n")));
+
+ HPM->event(HPET_FINAL);
+
+ chr->set_all_offline(-1);
+ chr->set_all_offline_sql();
+
+ inter->final();
+
+ sockt->flush_fifos();
+
+ do_final_mapif();
+ loginif->final();
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s`", ragsrvinfo_db) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 5658));
+
+ chr->char_db_->destroy(chr->char_db_,
+# 5660 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5660 "../../../server-code/src/char/char.c"
+ );
+ chr->online_char_db->destroy(chr->online_char_db,
+# 5661 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5661 "../../../server-code/src/char/char.c"
+ );
+ auth_db->destroy(auth_db,
+# 5662 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5662 "../../../server-code/src/char/char.c"
+ );
+
+ if( chr->char_fd != -1 ) {
+ sockt->close(chr->char_fd);
+ chr->char_fd = -1;
+ }
+
+ HPM_char_do_final();
+
+ SQL->Free(inter->sql_handle);
+ mapindex->final();
+
+ for (i = 0; i < 2; i++)
+ do { if (( (chr->server[i].maps)._max_ ) > 0) { (iMalloc->free((( (chr->server[i].maps)._data_ )),"../../../server-code/src/char/char.c", 5675, __func__)); ( (chr->server[i].maps)._data_ ) =
+# 5675 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5675 "../../../server-code/src/char/char.c"
+ ; ( (chr->server[i].maps)._max_ ) = 0; ( (chr->server[i].maps)._len_ ) = 0; } } while(
+# 5675 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 5675 "../../../server-code/src/char/char.c"
+ );
+
+ (iMalloc->free((chr->CHAR_CONF_NAME),"../../../server-code/src/char/char.c", 5677, __func__));
+ (iMalloc->free((chr->NET_CONF_NAME),"../../../server-code/src/char/char.c", 5678, __func__));
+ (iMalloc->free((chr->SQL_CONF_NAME),"../../../server-code/src/char/char.c", 5679, __func__));
+ (iMalloc->free((chr->INTER_CONF_NAME),"../../../server-code/src/char/char.c", 5680, __func__));
+
+ HPM->event(HPET_POST_FINAL);
+
+ (showmsg->showStatus(("Finished.\n")));
+ return
+# 5685 "../../../server-code/src/char/char.c" 3 4
+ 0
+# 5685 "../../../server-code/src/char/char.c"
+ ;
+}
+
+
+
+
+
+void do_abort(void)
+{
+}
+
+void set_server_type(void) {
+ (core->server_type) = SERVER_TYPE_CHAR;
+}
+
+
+void do_shutdown(void)
+{
+ if( core->runflag != CHARSERVER_ST_SHUTDOWN )
+ {
+ int id;
+ core->runflag = CHARSERVER_ST_SHUTDOWN;
+ (showmsg->showStatus(("Shutting down...\n")));
+
+ for( id = 0; id < ( (int)(sizeof(chr->server)/sizeof((chr->server)[0])) ); ++id )
+ mapif->server_reset(id);
+ loginif->check_shutdown();
+ sockt->flush_fifos();
+ core->runflag = CORE_ST_STOP;
+ }
+}
+
+
+
+
+
+
+
+static
+# 5723 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 5723 "../../../server-code/src/char/char.c"
+ cmdline_arg_charconfig (const char *name, const char *params)
+{
+ (iMalloc->free((chr->CHAR_CONF_NAME),"../../../server-code/src/char/char.c", 5725, __func__));
+ chr->CHAR_CONF_NAME = (iMalloc->astrdup((params),"../../../server-code/src/char/char.c", 5726, __func__));
+ return
+# 5727 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 5727 "../../../server-code/src/char/char.c"
+ ;
+}
+
+
+
+
+
+
+static
+# 5735 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 5735 "../../../server-code/src/char/char.c"
+ cmdline_arg_interconfig (const char *name, const char *params)
+{
+ (iMalloc->free((chr->INTER_CONF_NAME),"../../../server-code/src/char/char.c", 5737, __func__));
+ chr->INTER_CONF_NAME = (iMalloc->astrdup((params),"../../../server-code/src/char/char.c", 5738, __func__));
+ return
+# 5739 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 5739 "../../../server-code/src/char/char.c"
+ ;
+}
+
+
+
+
+
+
+static
+# 5747 "../../../server-code/src/char/char.c" 3 4
+ _Bool
+# 5747 "../../../server-code/src/char/char.c"
+ cmdline_arg_netconfig (const char *name, const char *params)
+{
+ (iMalloc->free((chr->NET_CONF_NAME),"../../../server-code/src/char/char.c", 5749, __func__));
+ chr->NET_CONF_NAME = (iMalloc->astrdup((params),"../../../server-code/src/char/char.c", 5750, __func__));
+ return
+# 5751 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 5751 "../../../server-code/src/char/char.c"
+ ;
+}
+
+
+
+void cmdline_args_init_local(void)
+{
+ cmdline->arg_add(((unsigned int)-1), "--" "char-config", '\0', cmdline_arg_charconfig, "Alternative char-server configuration.", CMDLINE_OPT_PARAM);
+ cmdline->arg_add(((unsigned int)-1), "--" "inter-config", '\0', cmdline_arg_interconfig, "Alternative inter-server configuration.", CMDLINE_OPT_PARAM);
+ cmdline->arg_add(((unsigned int)-1), "--" "net-config", '\0', cmdline_arg_netconfig, "Alternative network configuration.", CMDLINE_OPT_PARAM);
+}
+
+int do_init(int argc, char **argv) {
+ int i;
+ memset(&skillid2idx, 0, sizeof(skillid2idx));
+
+ char_load_defaults();
+
+ chr->CHAR_CONF_NAME = (iMalloc->astrdup(("conf/char-server.conf"),"../../../server-code/src/char/char.c", 5769, __func__));
+ chr->NET_CONF_NAME = (iMalloc->astrdup(("conf/network.conf"),"../../../server-code/src/char/char.c", 5770, __func__));
+ chr->SQL_CONF_NAME = (iMalloc->astrdup(("conf/inter-server.conf"),"../../../server-code/src/char/char.c", 5771, __func__));
+ chr->INTER_CONF_NAME = (iMalloc->astrdup(("conf/inter-server.conf"),"../../../server-code/src/char/char.c", 5772, __func__));
+
+ for (i = 0; i < 2; i++)
+ memset(&(chr->server[i].maps), 0, sizeof(chr->server[i].maps));
+
+ HPM_char_do_init();
+ cmdline->exec(argc, argv, CMDLINE_OPT_PREINIT);
+ HPM->config_read();
+ HPM->event(HPET_PRE_INIT);
+
+
+ mapindex->init();
+
+
+ start_point.map = mapindex->name2id("iz_int");
+
+
+
+
+ cmdline->exec(argc, argv, CMDLINE_OPT_NORMAL);
+ chr->config_read(chr->CHAR_CONF_NAME);
+ sockt->net_config_read(chr->NET_CONF_NAME);
+ chr->sql_config_read(chr->SQL_CONF_NAME);
+
+ if (strcmp(chr->userid, "s1")==0 && strcmp(chr->passwd, "p1")==0) {
+ (showmsg->showWarning(("Using the default user/password s1/p1 is NOT RECOMMENDED.\n")));
+ (showmsg->showNotice(("Please edit your 'login' table to create a proper inter-server user/password (gender 'S')\n")));
+ (showmsg->showNotice(("And then change the user/password to use in conf/char-server.conf (or conf/import/char_conf.txt)\n")));
+ }
+
+ inter->init_sql(chr->INTER_CONF_NAME);
+
+ auth_db = DB->alloc("../../../server-code/src/char/char.c",__func__,5804,DB_INT,(DB_OPT_RELEASE_DATA),sizeof(int));
+ chr->online_char_db = DB->alloc("../../../server-code/src/char/char.c",__func__,5805,DB_INT,(DB_OPT_RELEASE_DATA),sizeof(int));
+
+ HPM->event(HPET_INIT);
+
+ chr->mmo_char_sql_init();
+ chr->read_fame_list();
+
+ if ((sockt->naddr_ != 0) && (!login_ip || !chr->ip)) {
+ char ip_str[16];
+ sockt->ip2str(sockt->addr_[0], ip_str);
+
+ if (sockt->naddr_ > 1)
+ (showmsg->showStatus(("Multiple interfaces detected.. using %s as our IP address\n"), ip_str));
+ else
+ (showmsg->showStatus(("Defaulting to %s as our IP address\n"), ip_str));
+ if (!login_ip) {
+ (strlib->safestrncpy_((login_ip_str),(ip_str),(sizeof(login_ip_str))));
+ login_ip = sockt->str2ip(login_ip_str);
+ }
+ if (!chr->ip) {
+ (strlib->safestrncpy_((char_ip_str),(ip_str),(sizeof(char_ip_str))));
+ chr->ip = sockt->str2ip(char_ip_str);
+ }
+ }
+
+ loginif->init();
+ do_init_mapif();
+
+
+ timer->add_func_list(chr->broadcast_user_count, "chr->broadcast_user_count");
+ timer->add_interval(timer->gettick() + 1000, chr->broadcast_user_count, 0, 0, 5 * 1000);
+
+
+ timer->add_func_list(chr->waiting_disconnect, "chr->waiting_disconnect");
+
+
+ timer->add_func_list(chr->online_data_cleanup, "chr->online_data_cleanup");
+ timer->add_interval(timer->gettick() + 1000, chr->online_data_cleanup, 0, 0, 600 * 1000);
+
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `account_id` = '0'", char_db) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 5847));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `guild_lv` = '0' AND `max_member` = '0' AND `exp` = '0' AND `next_exp` = '0' AND `average_lv` = '0'", guild_db) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 5851));
+
+
+ if( (-1) == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '0' AND `account_id` = '0' AND `char_id` = '0'", guild_member_db) )
+ (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 5855));
+
+ sockt->set_defaultparse(chr->parse_char);
+
+ if ((chr->char_fd = sockt->make_listen_bind(bind_ip,chr->port)) == -1) {
+ (showmsg->showFatalError(("Failed to bind to port '""\033[1;37m""%d""\033[0m""'\n"),chr->port));
+ exit(
+# 5861 "../../../server-code/src/char/char.c" 3 4
+ 1
+# 5861 "../../../server-code/src/char/char.c"
+ );
+ }
+
+ Sql_HerculesUpdateCheck(inter->sql_handle);
+
+ console->input->setSQL(inter->sql_handle);
+ console->display_gplnotice();
+
+ (showmsg->showStatus(("The char-server is ""\033[1;32m""ready""\033[0m"" (Server is listening on the port %d).\n\n"), chr->port));
+
+ if( core->runflag != CORE_ST_STOP )
+ {
+ core->shutdown_callback = do_shutdown;
+ core->runflag = CHARSERVER_ST_RUNNING;
+ }
+
+ HPM->event(HPET_READY);
+
+ return 0;
+}
+
+void char_load_defaults(void)
+{
+ mapindex_defaults();
+ pincode_defaults();
+ char_defaults();
+ loginif_defaults();
+ mapif_defaults();
+ inter_auction_defaults();
+ inter_elemental_defaults();
+ inter_guild_defaults();
+ inter_homunculus_defaults();
+ inter_mail_defaults();
+ inter_mercenary_defaults();
+ inter_party_defaults();
+ inter_pet_defaults();
+ inter_quest_defaults();
+ inter_storage_defaults();
+ inter_defaults();
+ geoip_defaults();
+}
+
+void char_defaults(void)
+{
+ chr = &char_s;
+
+ memset(chr->server, 0, sizeof(chr->server));
+
+ chr->login_fd = 0;
+ chr->char_fd = -1;
+ chr->online_char_db =
+# 5911 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5911 "../../../server-code/src/char/char.c"
+ ;
+ chr->char_db_ =
+# 5912 "../../../server-code/src/char/char.c" 3 4
+ ((void *)0)
+# 5912 "../../../server-code/src/char/char.c"
+ ;
+
+ memset(chr->userid, 0, sizeof(chr->userid));
+ memset(chr->passwd, 0, sizeof(chr->passwd));
+ memset(chr->server_name, 0, sizeof(chr->server_name));
+
+ chr->ip = 0;
+ chr->port = 6121;
+ chr->server_type = 0;
+ chr->new_display = 0;
+
+ chr->waiting_disconnect = char_waiting_disconnect;
+ chr->delete_char_sql = char_delete_char_sql;
+ chr->create_online_char_data = char_create_online_char_data;
+ chr->set_account_online = char_set_account_online;
+ chr->set_account_offline = char_set_account_offline;
+ chr->set_char_charselect = char_set_char_charselect;
+ chr->set_char_online = char_set_char_online;
+ chr->set_char_offline = char_set_char_offline;
+ chr->db_setoffline = char_db_setoffline;
+ chr->db_kickoffline = char_db_kickoffline;
+ chr->set_login_all_offline = char_set_login_all_offline;
+ chr->set_all_offline = char_set_all_offline;
+ chr->set_all_offline_sql = char_set_all_offline_sql;
+ chr->create_charstatus = char_create_charstatus;
+ chr->mmo_char_tosql = char_mmo_char_tosql;
+ chr->memitemdata_to_sql = char_memitemdata_to_sql;
+ chr->mmo_gender = char_mmo_gender;
+ chr->mmo_chars_fromsql = char_mmo_chars_fromsql;
+ chr->mmo_char_fromsql = char_mmo_char_fromsql;
+ chr->mmo_char_sql_init = char_mmo_char_sql_init;
+ chr->char_slotchange = char_char_slotchange;
+ chr->rename_char_sql = char_rename_char_sql;
+ chr->check_char_name = char_check_char_name;
+ chr->make_new_char_sql = char_make_new_char_sql;
+ chr->divorce_char_sql = char_divorce_char_sql;
+ chr->count_users = char_count_users;
+ chr->mmo_char_tobuf = char_mmo_char_tobuf;
+ chr->mmo_char_send099d = char_mmo_char_send099d;
+ chr->mmo_char_send_ban_list = char_mmo_char_send_ban_list;
+ chr->mmo_char_send_slots_info = char_mmo_char_send_slots_info;
+ chr->mmo_char_send_characters = char_mmo_char_send_characters;
+ chr->char_married = char_char_married;
+ chr->char_child = char_char_child;
+ chr->char_family = char_char_family;
+ chr->disconnect_player = char_disconnect_player;
+ chr->authfail_fd = char_authfail_fd;
+ chr->request_account_data = char_request_account_data;
+ chr->auth_ok = char_auth_ok;
+ chr->ping_login_server = char_ping_login_server;
+ chr->parse_fromlogin_connection_state = char_parse_fromlogin_connection_state;
+ chr->auth_error = char_auth_error;
+ chr->parse_fromlogin_auth_state = char_parse_fromlogin_auth_state;
+ chr->parse_fromlogin_account_data = char_parse_fromlogin_account_data;
+ chr->parse_fromlogin_login_pong = char_parse_fromlogin_login_pong;
+ chr->changesex = char_changesex;
+ chr->parse_fromlogin_changesex_reply = char_parse_fromlogin_changesex_reply;
+ chr->parse_fromlogin_account_reg2 = char_parse_fromlogin_account_reg2;
+ chr->parse_fromlogin_ban = char_parse_fromlogin_ban;
+ chr->parse_fromlogin_kick = char_parse_fromlogin_kick;
+ chr->update_ip = char_update_ip;
+ chr->parse_fromlogin_update_ip = char_parse_fromlogin_update_ip;
+ chr->parse_fromlogin_accinfo2_failed = char_parse_fromlogin_accinfo2_failed;
+ chr->parse_fromlogin_accinfo2_ok = char_parse_fromlogin_accinfo2_ok;
+ chr->parse_fromlogin = char_parse_fromlogin;
+ chr->request_accreg2 = char_request_accreg2;
+ chr->global_accreg_to_login_start = char_global_accreg_to_login_start;
+ chr->global_accreg_to_login_send = char_global_accreg_to_login_send;
+ chr->global_accreg_to_login_add = char_global_accreg_to_login_add;
+ chr->read_fame_list = char_read_fame_list;
+ chr->send_fame_list = char_send_fame_list;
+ chr->update_fame_list = char_update_fame_list;
+ chr->loadName = char_loadName;
+ chr->parse_frommap_datasync = char_parse_frommap_datasync;
+ chr->parse_frommap_skillid2idx = char_parse_frommap_skillid2idx;
+ chr->map_received_ok = char_map_received_ok;
+ chr->send_maps = char_send_maps;
+ chr->parse_frommap_map_names = char_parse_frommap_map_names;
+ chr->send_scdata = char_send_scdata;
+ chr->parse_frommap_request_scdata = char_parse_frommap_request_scdata;
+ chr->parse_frommap_set_users_count = char_parse_frommap_set_users_count;
+ chr->parse_frommap_set_users = char_parse_frommap_set_users;
+ chr->save_character_ack = char_save_character_ack;
+ chr->parse_frommap_save_character = char_parse_frommap_save_character;
+ chr->select_ack = char_select_ack;
+ chr->parse_frommap_char_select_req = char_parse_frommap_char_select_req;
+ chr->change_map_server_ack = char_change_map_server_ack;
+ chr->parse_frommap_change_map_server = char_parse_frommap_change_map_server;
+ chr->parse_frommap_remove_friend = char_parse_frommap_remove_friend;
+ chr->char_name_ack = char_char_name_ack;
+ chr->parse_frommap_char_name_request = char_parse_frommap_char_name_request;
+ chr->parse_frommap_change_email = char_parse_frommap_change_email;
+ chr->ban = char_ban;
+ chr->unban = char_unban;
+ chr->ask_name_ack = char_ask_name_ack;
+ chr->changecharsex = char_changecharsex;
+ chr->parse_frommap_change_account = char_parse_frommap_change_account;
+ chr->parse_frommap_fame_list = char_parse_frommap_fame_list;
+ chr->parse_frommap_divorce_char = char_parse_frommap_divorce_char;
+ chr->parse_frommap_ragsrvinfo = char_parse_frommap_ragsrvinfo;
+ chr->parse_frommap_set_char_offline = char_parse_frommap_set_char_offline;
+ chr->parse_frommap_set_all_offline = char_parse_frommap_set_all_offline;
+ chr->parse_frommap_set_char_online = char_parse_frommap_set_char_online;
+ chr->parse_frommap_build_fame_list = char_parse_frommap_build_fame_list;
+ chr->parse_frommap_save_status_change_data = char_parse_frommap_save_status_change_data;
+ chr->send_pong = char_send_pong;
+ chr->parse_frommap_ping = char_parse_frommap_ping;
+ chr->map_auth_ok = char_map_auth_ok;
+ chr->map_auth_failed = char_map_auth_failed;
+ chr->parse_frommap_auth_request = char_parse_frommap_auth_request;
+ chr->parse_frommap_update_ip = char_parse_frommap_update_ip;
+ chr->parse_frommap_request_stats_report = char_parse_frommap_request_stats_report;
+ chr->parse_frommap_scdata_update = char_parse_frommap_scdata_update;
+ chr->parse_frommap_scdata_delete = char_parse_frommap_scdata_delete;
+ chr->parse_frommap = char_parse_frommap;
+ chr->search_mapserver = char_search_mapserver;
+ chr->mapif_init = char_mapif_init;
+ chr->lan_subnet_check = char_lan_subnet_check;
+ chr->delete2_ack = char_delete2_ack;
+ chr->delete2_accept_actual_ack = char_delete2_accept_actual_ack;
+ chr->delete2_accept_ack = char_delete2_accept_ack;
+ chr->delete2_cancel_ack = char_delete2_cancel_ack;
+ chr->delete2_req = char_delete2_req;
+ chr->delete2_accept = char_delete2_accept;
+ chr->delete2_cancel = char_delete2_cancel;
+ chr->send_account_id = char_send_account_id;
+ chr->parse_char_connect = char_parse_char_connect;
+ chr->send_map_info = char_send_map_info;
+ chr->send_wait_char_server = char_send_wait_char_server;
+ chr->search_default_maps_mapserver = char_search_default_maps_mapserver;
+ chr->parse_char_select = char_parse_char_select;
+ chr->creation_failed = char_creation_failed;
+ chr->creation_ok = char_creation_ok;
+ chr->parse_char_create_new_char = char_parse_char_create_new_char;
+ chr->delete_char_failed = char_delete_char_failed;
+ chr->delete_char_ok = char_delete_char_ok;
+ chr->parse_char_delete_char = char_parse_char_delete_char;
+ chr->parse_char_ping = char_parse_char_ping;
+ chr->allow_rename = char_allow_rename;
+ chr->parse_char_rename_char = char_parse_char_rename_char;
+ chr->parse_char_rename_char2 = char_parse_char_rename_char2;
+ chr->rename_char_ack = char_rename_char_ack;
+ chr->parse_char_rename_char_confirm = char_parse_char_rename_char_confirm;
+ chr->captcha_notsupported = char_captcha_notsupported;
+ chr->parse_char_request_captcha = char_parse_char_request_captcha;
+ chr->parse_char_check_captcha = char_parse_char_check_captcha;
+ chr->parse_char_delete2_req = char_parse_char_delete2_req;
+ chr->parse_char_delete2_accept = char_parse_char_delete2_accept;
+ chr->parse_char_delete2_cancel = char_parse_char_delete2_cancel;
+ chr->login_map_server_ack = char_login_map_server_ack;
+ chr->parse_char_login_map_server = char_parse_char_login_map_server;
+ chr->parse_char_pincode_check = char_parse_char_pincode_check;
+ chr->parse_char_pincode_window = char_parse_char_pincode_window;
+ chr->parse_char_pincode_change = char_parse_char_pincode_change;
+ chr->parse_char_pincode_first_pin = char_parse_char_pincode_first_pin;
+ chr->parse_char_request_chars = char_parse_char_request_chars;
+ chr->change_character_slot_ack = char_change_character_slot_ack;
+ chr->parse_char_move_character = char_parse_char_move_character;
+ chr->parse_char_unknown_packet = char_parse_char_unknown_packet;
+ chr->parse_char = char_parse_char;
+ chr->broadcast_user_count = char_broadcast_user_count;
+ chr->send_accounts_tologin_sub = char_send_accounts_tologin_sub;
+ chr->send_accounts_tologin = char_send_accounts_tologin;
+ chr->check_connect_login_server = char_check_connect_login_server;
+ chr->online_data_cleanup_sub = char_online_data_cleanup_sub;
+ chr->online_data_cleanup = char_online_data_cleanup;
+ chr->sql_config_read = char_sql_config_read;
+ chr->config_dispatch = char_config_dispatch;
+ chr->config_read = char_config_read;
+}