diff options
Diffstat (limited to 'servergreps/hercules/00000007/src/char.c')
-rw-r--r-- | servergreps/hercules/00000007/src/char.c | 16246 |
1 files changed, 16246 insertions, 0 deletions
diff --git a/servergreps/hercules/00000007/src/char.c b/servergreps/hercules/00000007/src/char.c new file mode 100644 index 0000000..486575e --- /dev/null +++ b/servergreps/hercules/00000007/src/char.c @@ -0,0 +1,16246 @@ +# 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, + + OPTION_CART1 = 0x00000008, + OPTION_CART2 = 0x00000080, + OPTION_CART3 = 0x00000100, + OPTION_CART4 = 0x00000200, + OPTION_CART5 = 0x00000400, + + OPTION_CART = OPTION_CART1|OPTION_CART2|OPTION_CART3|OPTION_CART4|OPTION_CART5, + + + 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 { + + + + + + int8 HERC__unavailable_struct; + +}; + +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]; + + + + +# 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"); + } +# 684 "../../../server-code/src/char/char.c" + 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; + + + + + 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"); +# 1310 "../../../server-code/src/char/char.c" + 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) + || (str + agi + vit + int_ + dex + luk != 6*5 ) + || (str < 1 || str > 9 || agi < 1 || agi > 9 || vit < 1 || vit > 9 || int_ < 1 || int_ > 9 || dex < 1 || dex > 9 || luk < 1 || luk > 9) + || (str + int_ != 10 || agi + luk != 10 || vit + dex != 10) ) + + + + + return -2; + + + + if( sd->found_char[slot] != -1 ) + return -2; +# 1583 "../../../server-code/src/char/char.c" + if( (-1) == SQL->Query(inter->sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `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', '%s', '%d', '%d', '%s', '%d', '%d')", + char_db, sd->account_id , slot, esc_name, start_zeny, 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", 1588, __func__), start_point.x, start_point.y, mapindex->id2name((start_point.map),"../../../server-code/src/char/char.c", 1588, __func__), start_point.x, start_point.y) ) + { + (SQL->ShowDebug_((inter->sql_handle), "../../../server-code/src/char/char.c", 1590)); + return -2; + } + + + 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)); +# 1767 "../../../server-code/src/char/char.c" + 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" + )); + + + + + + + WBUFW(buf,42) = (((p->hp) < ( +# 1869 "../../../server-code/src/char/char.c" 3 4 + (32767) +# 1869 "../../../server-code/src/char/char.c" + )) ? (p->hp) : ( +# 1869 "../../../server-code/src/char/char.c" 3 4 + (32767) +# 1869 "../../../server-code/src/char/char.c" + )); + WBUFW(buf,44) = (((p->max_hp) < ( +# 1870 "../../../server-code/src/char/char.c" 3 4 + (32767) +# 1870 "../../../server-code/src/char/char.c" + )) ? (p->max_hp) : ( +# 1870 "../../../server-code/src/char/char.c" 3 4 + (32767) +# 1870 "../../../server-code/src/char/char.c" + )); + + 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; +# 1934 "../../../server-code/src/char/char.c" + 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); + + + + 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; + + + + + + 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_characters(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(×tamp); + 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, ×tamp, 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; + + + 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) +{ + + + + + + + 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); +# 4465 "../../../server-code/src/char/char.c" + 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),RFIFOB(fd,26),RFIFOB(fd,27),RFIFOB(fd,28),RFIFOB(fd,29),RFIFOB(fd,30),RFIFOB(fd,31),RFIFOB(fd,32),RFIFOW(fd,33),RFIFOW(fd,35)); + + } + + + 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,37); + +} + + + +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; +# 4672 "../../../server-code/src/char/char.c" + (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_send_characters(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; +# 5019 "../../../server-code/src/char/char.c" + case 0x67: + { + do { if(RFIFOREST(fd) < (37)) return 0; if (sd== +# 5021 "../../../server-code/src/char/char.c" 3 4 + ((void *)0) +# 5021 "../../../server-code/src/char/char.c" + || !sd->auth) { RFIFOSKIP(fd,(37)); 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; +} |